大佬我这里哪错了qwq

P1443 马的遍历

输出出来是 ``` 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


|