C++实现含路障的棋盘棋子移动问题编程解
以下是一个使用广度优先搜索(BFS)算法来解决该问题的 C++ 代码: ```cpp #include <iostream> #include <queue> #include <vector> using namespace std; // 定义方向数组,分别表示上、下、左、右 const int dx[] = {-1, 1, 0, 0}; const int dy[] = {0, 0, -1, 1}; // 定义一个结构体来表示状态 struct State { int x, y; // 棋子的坐标 int time; // 当前时间 State(int _x, int _y, int _t) : x(_x), y(_y), time(_t) {} }; // 检查坐标 (x, y) 是否合法,是否越界或遇到路障 bool isValid(int x, int y, int n, const vector<vector<int>>& obstacles, int time) { return x >= 1 && x <= n && y >= 1 && y <= n && obstacles[time][x * (n + 1) + y] == 0; } // BFS 函数 int bfs(int n, const vector<vector<int>>& obstacles) { queue<State> q; // 标记数组,用于记录某个状态是否已经访问过 vector<vector<vector<bool>>> visited(n + 1, vector<vector<bool>>(n + 1, vector<bool>(n * n + 1, false))); // 初始状态入队 q.push(State(1, 1, 0)); visited[1][1][0] = true; while (!q.empty()) { State cur = q.front(); q.pop(); // 如果到达终点,返回当前时间 if (cur.x == n && cur.y == n) { return cur.time; } // 尝试向四个方向移动 for (int i = 0; i < 4; ++i) { int newX = cur.x + dx[i]; int newY = cur.y + dy[i]; int newTime = cur.time + 1; if (isValid(newX, newY, n, obstacles, newTime) && !visited[newX][newY][newTime]) { q.push(State(newX, newY, newTime)); visited[newX][newY][newTime] = true; } } } // 如果无法到达终点,返回 -1 return -1; } int main() { int n; cout << "请输入棋盘的大小 n: "; cin >> n; // 存储每一秒出现的路障信息 vector<vector<int>> obstacles(n * n + 1, vector<int>((n + 1) * (n + 1), 0)); cout << "请依次输入每一秒出现的路障坐标 (x y),输入 -1 -1 结束:" << endl; int x, y; for (int t = 1; t <= n * n; ++t) { cin >> x >> y; if (x == -1 && y == -1) { break; } obstacles[t][x * (n + 1) + y] = 1; } int result = bfs(n, obstacles); if (result != -1) { cout << "到达终点所需的最短时间是: " << result << " 秒" << endl; } else { cout << "无法到达终点。" << endl; } return 0; } ``` ### 代码解释: 1. **结构体 `State`**:用于表示棋子的状态,包含棋子的坐标 `(x, y)` 和当前时间 `time`。 2. **`isValid` 函数**:用于检查某个坐标 `(x, y)` 是否合法,即是否越界或遇到路障。 3. **`bfs` 函数**:使用广度优先搜索算法来寻找从起点 `(1, 1)` 到终点 `(n, n)` 的最短路径。 4. **`main` 函数**:读取用户输入的棋盘大小 `n` 和每一秒出现的路障坐标,调用 `bfs` 函数计算最短时间并输出结果。 ### 复杂度分析: - **时间复杂度**:$O(n^3)$,因为需要遍历所有可能的时间和坐标。 - **空间复杂度**:$O(n^3)$,主要用于存储访问标记数组。 ######[AI问答 | 1071点数解答 | 2026-03-07 19:12:46]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)336
- 8 - 1 数据结构大作业:功能完备、跨平台的资源管理器设计与实现 (GPT | 654点数解答 | 2024-12-04 19:07:22)349
- 数据结构大作业:100分资源管理器设计与实现,功能全、评分明!(GPT | 186点数解答 | 2024-12-04 21:33:38)235
- Python实现资源管理器大作业:涵盖多操作功能与错误处理要点(字节豆包 | 883点数解答 | 2024-12-05 15:03:36)242
- Python 实现资源管理器:管理、预览、操作文件与文件夹,附代码及注意要点(字节豆包 | 427点数解答 | 2024-12-05 15:06:07)358
- C 语言实现多功能资源管理器:含文件管理、预览及操作功能(字节豆包 | 607点数解答 | 2024-12-05 15:06:26)287
- 小学1年级“资源管理器”知识测试卷大揭秘!(字节豆包 | 374点数解答 | 2024-12-19 17:01:35)224
- 大三资源管理器测试卷:从理论到编程实战全解析(阿里通义 | 2000点数解答 | 2024-12-19 17:03:30)184
- Python 实现资源管理器:含代码示例与功能拓展要点,数据结构大作业示范 (字节豆包 | 526点数解答 | 2024-12-31 16:31:21)180
- Java 实现功能丰富的资源管理器:含代码示例与注意要点,数据结构大作业来袭! (字节豆包 | 499点数解答 | 2024-12-31 16:31:32)178
- C语言打造超实用资源管理器:文件管理、预览与操作全实现!(DeepSeek | 1797点数解答 | 2025-07-11 01:46:58)107
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)306