C++实现马在棋盘上最少步数的计算
以下是使用 C++ 实现计算马从点 `(x, y)` 到达棋盘上任意一个点最少要走几步的代码: ```cpp #include <iostream> #include <queue> #include <cstring> using namespace std; const int MAXN = 405; int n, m, x, y; int dist[MAXN][MAXN]; // 存储马到达每个点的最少步数 bool visited[MAXN][MAXN]; // 标记点是否已经访问过 // 马的 8 个可能移动方向 int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2}; int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; // 广度优先搜索函数 void bfs(int startX, int startY) { queue<pair<int, int>> q; q.push({startX, startY}); dist[startX][startY] = 0; visited[startX][startY] = true; while (!q.empty()) { auto [curX, curY] = q.front(); q.pop(); // 遍历马的 8 个可能移动方向 for (int i = 0; i < 8; ++i) { int newX = curX + dx[i]; int newY = curY + dy[i]; // 判断新位置是否在棋盘内且未被访问过 if (newX >= 1 && newX <= n && newY >= 1 && newY <= m && !visited[newX][newY]) { dist[newX][newY] = dist[curX][curY] + 1; visited[newX][newY] = true; q.push({newX, newY}); } } } } int main() { cin >> n >> m >> x >> y; // 初始化距离数组为 -1,表示不能到达 memset(dist, -1, sizeof(dist)); memset(visited, false, sizeof(visited)); // 从起始点开始进行广度优先搜索 bfs(x, y); // 输出结果矩阵 for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cout.width(5); // 设置输出宽度为 5 cout << dist[i][j]; } cout << endl; } return 0; } ``` ### 代码解释: 1. **输入处理**:读取棋盘的大小 `n` 和 `m`,以及马的起始位置 `(x, y)`。 2. **初始化**:使用 `memset` 函数将 `dist` 数组初始化为 -1,表示不能到达;将 `visited` 数组初始化为 `false`,表示所有点都未被访问过。 3. **广度优先搜索(BFS)**:从起始点 `(x, y)` 开始进行 BFS,使用队列存储待访问的点。每次从队列中取出一个点,遍历其 8 个可能的移动方向,如果新位置在棋盘内且未被访问过,则更新 `dist` 数组,并将新位置加入队列。 4. **输出结果**:遍历整个棋盘,输出马到达每个点的最少步数。 ### 复杂度分析: - **时间复杂度**:$O(nm)$,因为每个点最多被访问一次。 - **空间复杂度**:$O(nm)$,主要用于存储 `dist` 数组和 `visited` 数组。 ######[AI问答 | 873点数解答 | 2026-04-29 20:21:41]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)371
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)343
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)92
- C++ 实现根据输入正整数奇偶性计算偶数和或约数和(字节豆包 | 838点数解答 | 2026-02-28 20:23:59)51
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)271
- JavaScript 开发:用 Animation 实现自定义动画的简易教程 (阿里通义 | 333点数解答 | 2023-11-09 01:50:07)264
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)493
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)379
- Vue.js 与 Matter.js 碰撞:轻松实现物理模拟全攻略 (讯飞星火 | 522点数解答 | 2024-05-29 22:26:06)447
- JS实现移动端网页快捷键创建方式及注意事项(阿里通义 | 284点数解答 | 2024-06-05 19:02:59)282
- 车载系统 UML 类图设计:涵盖 Car、Engine、娱乐系统等的完整类定义与关系解析 (字节豆包 | 760点数解答 | 2024-08-15 22:51:04)329
- Java 继承实现:重温经典剪刀石头布游戏(字节豆包 | 451点数解答 | 2024-10-20 19:57:58)479