分层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),因为在循环内会添加节点。