代码:
#include<bits/stdc++.h>
using namespace std;
int dx[]={-1,-2,-2,-1,1,2,2,1};
int dy[]={-2,-1,1,2,-2,-1,1,2};
int n,m,A,B;
int vis[405][405];//标记,从起点到x,y的最小步数
struct node{
int x,y;
int step;// 从起点到x,y的最少步数
};
queue<node> que;
void bfs(int sx,int sy);// sx,sy:起点坐标
int main(){
memset(vis,-1,sizeof vis);//初始化为-1
cin >> n >> m >> A >> B;
bfs(A,B);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<vis[i][j]<<' ';
}
cout<<'\n';
}
return 0;
}
void bfs(int sx,int sy){
//处理起点
vis[sx][sy] = 1;
que.push(node{sx,sy,0});//node tmp = {sx ,sy, 0}; que.push(tmp);
//开始广搜,只要队列不为空,一直搜
while(que.size()!=0){
node hd = que.front();
que.pop();//取队头,丢队头
for(int i=0;i<8;i++){//遍历输出所有方向
int nx=hd.x+dx[i];
int ny=hd.y+dy[i];
int nstep=hd.step+1;//计算新点新步数
if(nx<0||ny<0||nx>n||ny>n||vis[nx][ny]!=-1){//判断新点不合法,出界
continue;
}
vis[nx][ny]++;
}
}
}