样例
2 3 1 1
输出如下
0 0 -1
0 -1 1
附上代码
#include<bits/stdc++.h>
using namespace std;
int const N=1e5+100;
int n,m,x,y;
const int mx[9]={0,-1,-2,-2,-1,1,2,2,1};
const int my[9]={0,2,1,-1,-2,2,1,-1,-2};
int ans[500][500],v[500][500];
int nx[N],ny[N];
void bfs(){
int t=1,w=0;
nx[1]=x;//初始化起点
ny[1]=y;
while(w<=t){
w++;
for(int i=1;i<=8;i++){//八个方向跳跃
int nmx=nx[w]+mx[i],nmy=ny[w]+my[i];//移动后的位置
if(nmx<1||nmy<1||nmy>m||nmx>n||v[nmx][nmy]==1)continue;//越界或已经来过
else{
// cout<<w<<" "<<i<<endl;
// cout<<nmx<<" "<<nmy<<endl;
v[nmx][nmy]=1;//到达新的点标记
ans[nmx][nmy]=ans[nx[w]][ny[w]]+1;//步数+1
nx[++t]=nmx;//储存新的坐标
ny[t]=nmy;
}
}
}
// for(int i=1;i<=t;i++)cout<<nx[i]<<" "<<ny[i]<<endl;
}
int main(){
memset(ans,-1,sizeof(ans));
cin>>n>>m>>x>>y;
ans[x][y]=0;
v[x][y]=1;
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<setw(4)<<ans[i][j];
}cout<<endl;
}
return 0;
}