没时间看代码,但是您可以参考一下我一万年以前的程序,看看问题在哪里
```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