@[CadeShuWindsor](/user/452450) 三重循环,建议重构
by hepp @ 2022-08-19 11:12:48
@[CadeShuWindsor](/user/452450) 还有这题的输出很诡异,可以看看题解
by hepp @ 2022-08-19 11:14:37
@[CadeShuWindsor](/user/452450) 只用从 $(x2,y2)$ 起点遍历一次就可以了,将马能走到的点更新答案,可以就用数组 $a$ 来更新答案(全部初始化为 $-1$ ,再将起点 $a[x2][y2]$ 初始化为 $0$ ,就可以用 $BFS$ 更新答案了)
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,x2,y2;
int a[405][405];
struct Tnode{
int x,y;
int step;
}qu[164025];
int dx[8]={-1,1,2,2,1,-1,-2,-2};
int dy[8]={2,2,1,-1,-2,-2,-1,1};
int BFS(int x0,int y0)
{
qu[0].x=x0;
qu[0].y=y0;
int head=0;
int tail=1;
while(head<tail)
{
int x=qu[head].x;
int y=qu[head].y;
int s=qu[head].step;
head++;
for(int d=0;d<8;d++)
{
int nx=x+dx[d];
int ny=y+dy[d];
if(nx<=n&&ny<=m&&nx>0&&ny>0&&a[nx][ny]==-1)
{
a[nx][ny]=s+1;
qu[tail].step=s+1;
qu[tail].x=nx;
qu[tail++].y=ny;
}
}
}
return -1;
}
int main(){
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&x2);
scanf("%d",&y2);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=-1;
a[x2][y2]=0;
BFS(x2,y2);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
```
by _Vix_ @ 2022-08-19 11:16:43
@[hepp](/user/541313) 感谢大佬提醒
by CadeShuWindsor @ 2022-08-20 07:53:11
@[Zheng07](/user/482965) 感谢大佬!!现在差不多懂了
%%%%
by CadeShuWindsor @ 2022-08-20 07:53:36