c++利用队列和类实现迷宫问题
时间: 2023-12-14 19:06:34 浏览: 77
好的,下面是一个简单的 C++ 实现,利用队列和类来解决迷宫问题:
```c++
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 1005; // 迷宫的最大大小
class Node {
public:
int x, y; // 当前节点的坐标
int step; // 到达当前节点的步数
};
int n, m; // 迷宫的大小
char maze[MAXN][MAXN]; // 迷宫矩阵
bool vis[MAXN][MAXN]; // 标记矩阵,表示该位置是否被访问过
int dx[] = {0, 0, -1, 1}; // 方向数组,表示上下左右四个方向
int dy[] = {-1, 1, 0, 0};
Node start, end; // 起点和终点
bool bfs() {
queue<Node> q;
q.push(start);
vis[start.x][start.y] = true;
while (!q.empty()) {
Node cur = q.front();
q.pop();
if (cur.x == end.x && cur.y == end.y) { // 到达终点
cout << "步数为:" << cur.step << endl;
return true;
}
for (int i = 0; i < 4; i++) {
int nx = cur.x + dx[i], ny = cur.y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && maze[nx][ny] != '#' && !vis[nx][ny]) {
Node next;
next.x = nx;
next.y = ny;
next.step = cur.step + 1;
q.push(next);
vis[nx][ny] = true;
}
}
}
return false;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> maze[i][j];
if (maze[i][j] == 'S') {
start.x = i;
start.y = j;
start.step = 0;
}
if (maze[i][j] == 'E') {
end.x = i;
end.y = j;
}
}
}
if (!bfs()) {
cout << "无法到达终点!" << endl;
}
return 0;
}
```
以上代码中,首先定义了一个 `Node` 类,表示一个节点的坐标和到达该节点的步数。然后定义了迷宫的大小、迷宫矩阵和标记矩阵,还有起点和终点。在 `bfs()` 函数中,采用广度优先搜索算法,遍历当前节点的四个方向,判断下一个节点是否可行,如果可行,则将其加入队列,并将该节点标记为已访问。当到达终点时,输出到达终点的步数,并返回 `true`;如果无法到达终点,则输出提示信息,并返回 `false`。最后在 `main()` 函数中,读入迷宫信息,并进行搜索。
阅读全文