30求助

P1443 马的遍历

```cpp #include <bits/stdc++.h> using namespace std; int n,m,sx,sy,used[1111][1111],dx[8]={1,1,-1,-1,2,2,-2,-2},dy[8]={2,-2,2,-2,1,-1,1,-1}; typedef pair<int,int>pi; queue<pi>q; void bfs() { queue<pi>q; memset(used,-1,sizeof(used)); used[sx][sy]=0; q.push({sx,sy}); while(!q.empty()) { pi t=q.front(); q.pop(); int x=t.first,y=t.second; for(int i=0;i<8;i++) { int nx=x+dx[i],ny=y+dy[i]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&used[nx][ny]==-1) { used[nx][ny]=used[x][y]+1; q.push({nx,ny}); } } } } int main () { cin>>n>>m>>sx>>sy; bfs(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%-5d",used[i][j]); cout<<endl; } return 0; } ``` 你可以看一下我的
by __D_A_T__ @ 2024-01-24 21:04:28


@[ive_wonyoung](/user/1043012) 您的代码,第 16 行, `nb<=n` 应该是 `nb<=m` 。原因是,$nb$ 枚举的是列数,列数的限制是 $m$ 。
by xiaozengX @ 2024-01-24 21:09:05


~~GPT 版~~ 在你的代码中,有几个问题需要修正: 1. **数组访问越界问题**: - 你的 `s` 数组和 `vis` 数组的大小设置为 `2500x2500` 和 `250000`,可能不足以覆盖所有的情况,尤其是当 `n` 和 `m` 的值接近 400 时。由于 `n` 和 `m` 最大可以到 400,所以你需要确保 `s` 数组和 `vis` 数组足够大,至少应该是 `400x400` 和 `160000`(因为 400*400=160000)。 2. **越界检查错误**: - 在检查新位置是否在棋盘内时,你的代码中有 `nb>=1 && nb<=n`,这应该是 `nb>=1 && nb<=m`,因为 `nb` 与列数 `m` 相关。 3. **`vis` 数组使用不当**: - 你使用了 `s[a][b]` 的值来作为 `vis` 数组的索引,这样做的意图是将二维坐标映射到一维。但这实际上是不必要的,你可以直接使用二维数组 `vis[a][b]` 来标记是否访问过。这样更直观,也减少了出错的机会。 4. **队列使用不当**: - 使用两个队列 `v1` 和 `v2` 来分别存储 x 坐标和 y 坐标是可行的,但不是最佳实践。更好的做法是定义一个结构体或使用 `pair<int, int>` 来存储坐标,这样你可以只用一个队列来存储坐标对。 5. **`ans` 数组初始化问题**: - 你没有初始化 `ans` 数组,所以如果某个位置不可达,它可能会显示垃圾值而不是 `-1`。你需要在 BFS 开始之前将 `ans` 数组中的所有值初始化为 `-1`。 6. **代码风格**: - 代码风格方面,建议你使用有意义的变量名,这样代码更易读、易维护。 修正后的代码如下: ```cpp #include<bits/stdc++.h> using namespace std; const int MAXN = 405; // 增加了常量定义,使得数组大小更清晰 int n, m, x, y, ans[MAXN][MAXN], vis[MAXN][MAXN]; int d[8][2] = {{2, -1}, {2, 1}, {1, 2}, {-1, 2}, {-2, 1}, {-2, -1}, {-1, -2}, {1, -2}}; queue<pair<int, int>> q; // 使用 pair 来存储坐标 void bfs(int a, int b) { q.push({a, b}); ans[a][b] = 0; vis[a][b] = 1; while (!q.empty()) { int cur_x = q.front().first, cur_y = q.front().second; q.pop(); for (int i = 0; i < 8; i++) { int na = cur_x + d[i][0], nb = cur_y + d[i][1]; if (na >= 1 && na <= n && nb >= 1 && nb <= m && !vis[na][nb]) { q.push({na, nb}); vis[na][nb] = 1; ans[na][nb] = ans[cur_x][cur_y] + 1; } } } } int main() { cin >> n >> m >> x >> y; memset(ans, -1, sizeof(ans)); // 初始化 ans 数组为 -1 bfs(x, y); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { printf("%-5d", ans[i][j]); } cout << endl; } return 0; } ``` 在这个修正版本中,我修改了数组大小,调整了数组的使用,使用了 `pair<int, int>` 来简化队列操作,并且初始化了 `ans` 数组。这些修改应该能帮助你的代码正确地解决问题。
by xiaozengX @ 2024-01-24 21:13:40


@[xiaozengX](/user/321529) 很感谢但是这个真的是gpt的功能吗 好高级
by ive_wonyoung @ 2024-01-24 21:33:52


@[ive_wonyoung](/user/1043012) AUV你怎么沦落到求助的地步啊LOL
by a_little_carrot @ 2024-02-08 14:32:33


@[a_little_carrot](/user/1042960) 。。。
by ive_wonyoung @ 2024-02-10 15:16:27


@[a_little_carrot](/user/1042960) 要是oj有讨论区我也要问。。。毕竟我现在就打算发一道oj的题目到讨论区求助。。。对不起求助说明我好学 ### 还有你举报我成功了吗(滑稽
by ive_wonyoung @ 2024-02-10 20:39:07


|