稍等 我把手上的事情搞完就帮你看看 应该不是很难
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