用队列求解迷宫最短路径问题,使用C++
时间: 2024-11-15 21:25:19 浏览: 16
c语言支持自己创建迷宫,并求解最短路(C语言课程设计).rar
在C++中,我们可以利用广度优先搜索(Breadth First Search, BFS)算法结合队列数据结构解决迷宫的最短路径问题。这里是一个基本的步骤:
1. **初始化**:
- 创建一个二维数组表示迷宫,其中0代表通路,非0值代表墙壁。
- 初始化起点(start)到所有节点的距离为无穷大,除了起点自身距离设为0。
- 创建一个队列存储待访问的节点,将起点放入队列。
2. **遍历**:
- 当队列非空时,循环执行以下操作:
- 取出队首的节点,如果该节点是终点,则找到了最短路径,返回路径长度。
- 如果节点不是终点,更新其相邻且未访问过的节点(上下左右),将它们的距离设置为当前节点的距离加一,并将它们加入队列。
3. **路径记录**:
- 每次从队列取出节点时,记得保存下一条路径,以便于回溯找到实际的路径序列。
4. **结束条件**:
- 如果队列为空并且没有找到终点,说明迷宫中不存在从起点到达终点的路径。
5. **实现**:
使用`std::queue`容器(如`std::queue<std::pair<int, int>>`)来存储节点位置,同时可以考虑用一个辅助的邻接表或二维数组来加速查找。
```cpp
#include <iostream>
#include <queue>
using namespace std;
// 根据坐标检查是否越界
bool isValid(int row, int col, int mazeSize) {
return row >= 0 && row < mazeSize && col >= 0 && col < mazeSize;
}
int bfs(int maze[mazeSize][mazeSize], int startRow, int startCol, int endRow, int endCol) {
// 初始化距离数组
vector<vector<int>> dist(mazeSize, vector<int>(mazeSize, INT_MAX));
dist[startRow][startCol] = 0;
queue<pair<int, int>> q;
q.push({startRow, startCol});
while (!q.empty()) {
auto [row, col] = q.front();
q.pop();
if (row == endRow && col == endCol)
return dist[row][col]; // 找到了目标点
for (auto [dx, dy] : {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}) {
int newRow = row + dx, newCol = col + dy;
if (isValid(newRow, newCol, mazeSize) && maze[newRow][newCol] == 0 && dist[newRow][newCol] > dist[row][col] + 1) {
dist[newRow][newCol] = dist[row][col] + 1;
q.push({newRow, newCol});
}
}
}
return -1; // 无解
}
int main() {
int maze[] = {
// 迷宫地图的示例
// ...省略...
};
int start = 0, end = find_end(maze); // 找到起点和终点
cout << "Shortest path length is: " << bfs(maze, start, start, end, end) << endl;
return 0;
}
```
阅读全文