c++实现bfs二维迷宫中的最短路径
时间: 2023-09-15 10:16:11 浏览: 156
好的,以下是一个基于C++的BFS求二维迷宫中最短路径的示例代码:
```cpp
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 1005; // 最大节点数
const int INF = 0x3f3f3f3f; // 无穷大
int n, m; // n表示迷宫的行数,m表示迷宫的列数
int sx, sy, ex, ey; // 起点和终点的坐标
int maze[MAXN][MAXN]; // 存储迷宫的地图
int dis[MAXN][MAXN]; // 存储起点到每个节点的距离
bool vis[MAXN][MAXN]; // 记录每个节点是否被访问过
struct node {
int x, y; // 节点坐标
};
void bfs() {
memset(dis, INF, sizeof(dis)); // 初始化距离为无穷大
memset(vis, false, sizeof(vis)); // 初始化所有节点都未被访问过
dis[sx][sy] = 0; // 起点到自己的距离为0
vis[sx][sy] = true; // 起点已经访问过了
queue<node> q; // 定义一个队列,用于广度优先搜索
q.push({sx, sy}); // 将起点加入队列
while (!q.empty()) {
node u = q.front();
q.pop(); // 取出队首节点
int dx[4] = {0, 0, 1, -1}; // 四个方向
int dy[4] = {1, -1, 0, 0};
for (int i = 0; i < 4; ++i) {
int x = u.x + dx[i];
int y = u.y + dy[i];
if (x >= 1 && x <= n && y >= 1 && y <= m && maze[x][y] != 1 && !vis[x][y]) { // 如果这个点可行且未被访问过
dis[x][y] = dis[u.x][u.y] + 1; // 更新距离
vis[x][y] = true; // 标记为已访问
q.push({x, y}); // 将其加入队列
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> maze[i][j];
}
}
cin >> sx >> sy >> ex >> ey;
bfs();
cout << "起点到终点的最短距离为:" << dis[ex][ey] << endl;
return 0;
}
```
这段代码使用二维数组存储迷宫地图和节点距离,时间复杂度为O(nm),其中n表示迷宫的行数,m表示迷宫的列数。需要注意的是,在实际使用中,可能需要根据具体情况调整代码。
阅读全文