```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