求助0分BFS全wa

P1443 马的遍历

稍等 我把手上的事情搞完就帮你看看 应该不是很难
by HuaJunL @ 2023-06-27 21:56:22


在吗 xxs正在极速为您写代码 请稍后……
by HuaJunL @ 2023-06-27 22:22:39


好吧,我放弃了
by HuaJunL @ 2023-06-27 22:51:20


for(i=0;i<7;i++) 这一句有误。 马可以跳到8个方向,所以循环应为for(i=0;i<8;i++)
by filletoto @ 2023-06-29 14:34:35


这是我的AC代码 ```cpp #include <bits/stdc++.h> using namespace std; queue<pair<int, int>> q; // 定义一个队列用于广度优先搜索 bool vis[405][405]; // 定义一个二维布尔数组表示节点是否被访问过 int ans[405][405]; // 定义一个二维整型数组存储每个节点的最短路径长度 const int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}; // x坐标的偏移量,表示马可以走的八个方向 const int dy[8] = {2, 1, -1, -2, 2, 1, -1, -2}; // y坐标的偏移量,表示马可以走的八个方向 int main() { ios::sync_with_stdio(false); // 提高输入输出速度 int n, m, x, y; scanf("%d%d%d%d", &n, &m, &x, &y); // 输入n、m、x、y的值,表示棋盘大小和起始位置坐标 memset(ans, -1, sizeof(ans)); // 将ans数组全部初始化为-1,表示不可到达 memset(vis, false, sizeof(vis)); // 将vis数组全部初始化为false,表示所有节点未被访问过 vis[x][y] = true; // 起始位置标记为已访问 ans[x][y] = 0; // 起始位置到自身的最短路径长度为0 q.push(make_pair(x, y)); // 将起始位置加入队列 while (!q.empty()) { int nx = q.front().first; // 取出队头节点的x坐标 int ny = q.front().second; // 取出队头节点的y坐标 for (int k = 0; k < 8; k++) { int ti = nx + dx[k]; // 计算下一个节点的x坐标 int tj = ny + dy[k]; // 计算下一个节点的y坐标 // 判断下一个节点是否在棋盘范围内且未被访问过 if (ti >= 1 && ti <= n && tj >= 1 && tj <= m && !vis[ti][tj]) { vis[ti][tj] = true; // 标记下一个节点为已访问 q.push(make_pair(ti, tj)); // 将下一个节点加入队列 ans[ti][tj] = ans[nx][ny] + 1; // 更新下一个节点到起始位置的最短路径长度 } } q.pop(); // 弹出队头节点 } // 输出每个节点的最短路径长度 for (int i = 1; i <= n; i++) { printf("%d", ans[i][1]); // 输出第一列的路径长度 for (int j = 2; j <= m; j++) { printf("%5d", ans[i][j]); // 输出其他列的路径长度,并保留5位宽度 } printf("\n"); // 换行 } return 0; } ```
by filletoto @ 2023-06-29 14:39:05


|