输出出来是
```
0 -1 -1
-1 3 1
2 1 -1
```
by bj12z_wangziqian @ 2022-10-26 22:34:56
不知道你这程序是怎么在本地跑出来的,我在本地直接CE...
先说一下,小问题有点多哈
首先,第 $35$ 行
```cpp
for (int i=0;i<=8;i++)
```
你仔细想想,i能等于8吗?你的数组最大开到了8,最大下标只到了7,所以取8是不对的。
与之类似的问题还有第 $54$~$56$行
```cpp
for(int i = 0;i<=410;i++)
{
for(int j = 0;j<=410;j++)
{
a[i][j] = -1;
}
}
```
这里也是不能取等的,不然就数组就越界了。
第二,是你的check函数,第 $18$ 行
```cpp
if(x>=1&&x<=m&&y>=1&&y<=n&&a[x][y]==-1)
```
x对应的是n,y对应的是m,你的判断边界条件写反了。
第三,是你的bfs函数,第 $39$ 行和 $44$ 行
```cpp
if (check(nx,ny)&&b[nx][nx])
b[nx][ny] = false;
```
你开的bool数组b默认都是false,所以走过是 true,没走过是 false,那么入队的条件应该是还没走过才对,而你正好写反了。
第四,还有一个小问题,虽然不影响评测,但正式比赛可能会爆零。在bfs函数的最后,你并没有加 return; 虽然它是一个 void 函数,但是也是要写返回值的,这是一个好习惯。
改完AC代码如下:
```cpp
#include <iostream>
#include <queue>
using namespace std;
#define N 410
int a[411][411];
bool b[N][N];
struct bfss
{
int x,y;
};
int dx[8]={-2,-2,2,2,1,-1,1,-1};
int dy[8]={-1,1,-1,1,2,-2,-2,2};
int m,n;
queue <bfss> q;
bool check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]==-1)
return true;
else
return false;
}
void bfs(int x,int y,int step){
a[x][y] = step;
b[x][y] = true;
bfss n;
n.x = x;
n.y = y;
q.push(n);
bfss t;
while(!q.empty())
{
t=q.front();
q.pop();
for (int i=0;i<8;i++)
{
int nx=t.x+dx[i];
int ny=t.y+dy[i];
if (check(nx,ny)&&!b[nx][ny])
{
n.x=nx;
n.y=ny;
q.push(n);
b[nx][ny] = true;
a[nx][ny] = a[t.x][t.y]+1;
}
}
}
return;
}
int main()
{
for(int i = 0;i<=410;i++)
{
for(int j = 0;j<=410;j++)
{
a[i][j] = -1;
}
}
int x,y;
cin >> n >> m >> x >> y;
bfs(x,y,0);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
by Wind_Journey @ 2022-10-27 00:01:59
另外,给你一个小建议哈,以后编译选项里打开 -Wall 这个可以帮助你找到很多诸如数组越界 无返回值的小错误,也算是一个技巧了。
by Wind_Journey @ 2022-10-27 00:07:43
@[bj12z_wangziqian](/user/757092)
by Wind_Journey @ 2022-10-27 12:42:21
谢谢大佬@[Wind_Journey](/user/332488)
好人一生平安!!!
by bj12z_wangziqian @ 2022-10-27 16:29:47