代码实现n*m迷宫问题栈c++
时间: 2023-11-29 14:05:10 浏览: 80
C++栈实现迷宫问题
5星 · 资源好评率100%
好的,下面是一个使用栈解决n*m迷宫问题的C++代码示例:
```c++
#include <iostream>
#include <stack>
using namespace std;
const int N = 1005;
int maze[N][N]; // 用二维数组表示迷宫
bool vis[N][N]; // 记录节点是否被访问过
int n, m; // 迷宫的行数和列数
int sx, sy; // 起点坐标
int ex, ey; // 终点坐标
// 定义一个节点结构体
struct Node {
int x, y; // 节点坐标
int dir; // 方向(0表示向上,1表示向右,2表示向下,3表示向左)
};
// 判断节点是否合法
bool isValid(Node node) {
int x = node.x, y = node.y;
if (x < 1 || x > n || y < 1 || y > m) return false; // 越界
if (maze[x][y] == 1 || vis[x][y]) return false; // 障碍物或已访问
return true;
}
// 栈解法
bool DFS() {
stack<Node> st;
st.push({sx, sy, 0}); // 将起点入栈
vis[sx][sy] = true;
while (!st.empty()) {
Node node = st.top(); st.pop();
if (node.x == ex && node.y == ey) return true; // 到达终点
// 尝试向4个方向前进
for (int i = node.dir; i < 4; i++) {
int dx = 0, dy = 0;
if (i == 0) dx = -1;
else if (i == 1) dy = 1;
else if (i == 2) dx = 1;
else dy = -1;
Node nextNode = {node.x + dx, node.y + dy, i};
if (isValid(nextNode)) {
st.push(node); // 将当前节点入栈
st.push(nextNode); // 将下一个节点入栈
vis[nextNode.x][nextNode.y] = true;
break;
}
}
}
return false; // 无法到达终点
}
int main() {
cin >> n >> m;
cin >> sx >> sy >> ex >> ey;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> maze[i][j];
}
}
if (DFS()) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
```
希望这个例子能够帮助你更好地理解如何使用栈来解决迷宫问题。
阅读全文