求助!求助!我好像出了大问题

P1443 马的遍历

没时间看代码,但是您可以参考一下我一万年以前的程序,看看问题在哪里 ```cpp #include <bits/stdc++.h> using namespace std; struct point { int x,y; int cntr=0; }; int n,m,X,Y; int cnt[405][405]; bool vis[405][405]; int dx[9]={0,-2,-2,-1,-1,1,1,2,2},dy[9]={0,1,-1,2,-2,2,-2,1,-1}; queue<point> q; bool van(int x,int y) { if(x>=0&&x<n&&y<m&&y>=0&&!vis[x][y]) return true; return false; } void bfs(int x,int y) { point temp; temp.x=x; temp.y=y; q.push(temp); vis[x][y]=1; while(!q.empty()) { temp=q.front(); temp.cntr++; q.pop(); for(int i=1;i<=8;i++) { int xx=temp.x+dx[i]; int yy=temp.y+dy[i]; //temp.cntr++; if(van(xx,yy)) { vis[xx][yy]=1; cnt[xx][yy]=temp.cntr; //cout<<temp.cntr<<endl; point tt; tt.x=xx; tt.y=yy; tt.cntr=temp.cntr; q.push(tt); } } } while(!q.empty()) q.pop(); } int main() { memset(vis,0,sizeof(vis)); cin>>n>>m>>X>>Y; bfs(X-1,Y-1); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(cnt[i][j]!=0||(i==X-1&&j==Y-1)) printf("%-5d",cnt[i][j]); else printf("%-5d",-1); } printf("\n"); } return 0; } ```
by Neutralized @ 2022-05-08 15:27:40


@[orcasquirrel](/user/530570) 您在给ans赋值时赋成了0; 而您在下面判段有没有访问坐标时语句是 ``` ans[x][y] != -1 ``` 所以ans所有值一定不等于-1;此处语句在判断 位置是否被访问时不起效 所以有些位上的步数为最后一次步数; 应把int main下的赋值改为 ``` for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ ans[i][j] = -1; } } ``` 您可再试试
by SSSdyzs @ 2022-06-03 17:17:04


而且在输出时您的换行有问题 建议将 ``` puts("\n"); ``` 改为 ``` cout<<endl; ```
by SSSdyzs @ 2022-06-03 17:20:43


我觉得还应把倒数第11行 ``` ans[x][y]++; ``` 改为 ``` ans[x][y]=d+1; ```
by SSSdyzs @ 2022-06-03 17:22:52


@[orcasquirrel](/user/530570) 然后改完的代码就是AC代码了
by SSSdyzs @ 2022-06-03 17:24:12


|