用1表示死路,用0表示通路,使用C++语言编写一个简单的用栈求解迷宫问题所有路径及最短路径程序
时间: 2024-02-03 09:12:34 浏览: 80
用栈、回溯算法设计迷宫程序
以下是一个简单的用栈求解迷宫问题所有路径及最短路径的C++程序:
```c++
#include <iostream>
#include <stack>
using namespace std;
const int N = 5; // 迷宫大小为5*5
int maze[N][N] = { {0, 0, 1, 0, 1},
{0, 0, 1, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 0, 0},
{0, 0, 1, 0, 0} }; // 迷宫地图,0表示通路,1表示障碍物
struct Node {
int x, y, step;
Node(int _x, int _y, int _step) : x(_x), y(_y), step(_step) {} // 定义一个结构体表示节点的坐标和步数
};
stack<Node> s; // 定义一个栈存储节点
void printPath(stack<Node> path) { // 打印路径
stack<Node> tmp;
while (!path.empty()) {
tmp.push(path.top());
path.pop();
}
while (!tmp.empty()) {
cout << "(" << tmp.top().x << ", " << tmp.top().y << ") ";
tmp.pop();
}
cout << endl;
}
void findPath() {
int dx[4] = {0, 1, 0, -1}; // 定义四个方向
int dy[4] = {1, 0, -1, 0};
s.push(Node(0, 0, 0)); // 将起点压入栈中
while (!s.empty()) {
Node cur = s.top();
s.pop();
if (cur.x == N-1 && cur.y == N-1) { // 到达终点
printPath(s); // 打印路径
cout << "步数为:" << cur.step << endl; // 打印步数
return;
}
for (int i = 0; i < 4; i++) { // 遍历四个方向
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < N && maze[nx][ny] == 0) { // 判断是否越界和是否是通路
s.push(Node(nx, ny, cur.step+1)); // 将新节点压入栈中
maze[nx][ny] = 1; // 标记为已经走过
}
}
}
}
int main() {
findPath();
return 0;
}
```
代码中使用了一个栈来存储节点,每次从栈中取出一个节点,判断它是否到达终点,如果到达终点则输出路径和步数,否则遍历四个方向,将新节点压入栈中,同时标记为已经走过。这里只求了一条最短路径,如果要求所有的最短路径,可以使用广度优先搜索算法。
阅读全文