分层BFS:搜索层,记录被访问的节点数。
neib()扩展分支;用st记录当前层节点数,保证把每一层遍历结束后进入下一层,这样就知道这一层的遍历有没有结束(也就能知道到了第几层)。

#include<bits/stdc++.h>
using namespace std;
 
vector<vector<int>> visited;
 
vector<pair<int,int>> neib(pair<int,int> p){
	auto [x,y]=p;
	vector<pair<int,int>> ret{
		{x-1,y+2},{x+1,y+2},{x+2,y+1},{x+2,y-1},{x+1,y-2},{x-1,y-2},{x-2,y-1},{x-2,y+1}
	};
	return ret;
}
 
int main(){
	cerr.rdbuf(nullptr);
	ios::sync_with_stdio(false);cin.tie(nullptr);
	int n,k,x,y;
	cin>>n>>k>>x>>y;
	visited.resize(n+1,vector<int>(n+1,0));
	visited[x][y]=1;
	queue<pair<int,int>> q;
	q.push({x,y});
	int ans=1; // (x,y)
	for(int i=0;i<k;i++){
		int sz=q.size();
		for(int j=0;j<sz;j++){
			auto cur=q.front();
			q.pop();
			for(auto [nx,ny]:neib(cur)){
				if(nx>0 && ny>0 && nx<=n && ny<=n && !visited[nx][ny]){
					q.push({nx,ny});
					visited[nx][ny]=1;
					ans++;
				}
			}
		}
	}
	cout<<ans;
}

一些细节:

  • “入栈(q.push)、标记访问(visited)、访问节点数(cnt)自增”放在一起。
  • 暂存当前层的节点(sz),因为在循环内会添加节点。