RE 0分求助

P1443 马的遍历

@[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


|