迷宫求解c++任务:以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 要求:首先实现一个栈类型,然后编写一个求
时间: 2023-08-31 08:09:24 浏览: 129
解迷宫的函数,使用深度优先搜索算法。
下面是一个简单的实现示例:
```c++
#include <iostream>
#include <stack>
using namespace std;
const int MAXN = 100;
int maze[MAXN][MAXN]; // 迷宫
int mark[MAXN][MAXN]; // 标记数组
int n, m; // 迷宫大小
int sx, sy, tx, ty; // 入口和出口坐标
struct Node {
int x, y; // 坐标
int dir; // 方向
Node(int x=0, int y=0, int dir=0): x(x), y(y), dir(dir) {}
};
// 方向数组,0为上,1为右,2为下,3为左
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
// 判断当前位置是否可以走
bool isValid(int x, int y) {
if (x < 0 || x >= n || y < 0 || y >= m)
return false;
if (maze[x][y] == 1 || mark[x][y] == 1)
return false;
return true;
}
// 深度优先搜索
bool dfs() {
stack<Node> s;
s.push(Node(sx, sy, 0));
while (!s.empty()) {
Node cur = s.top();
s.pop();
int x = cur.x, y = cur.y, dir = cur.dir;
while (dir < 4) {
int tx = x + dx[dir], ty = y + dy[dir];
if (tx == tx && ty == ty) {
mark[tx][ty] = 1;
cout << "(" << tx << "," << ty << ")" << endl;
return true;
}
if (isValid(tx, ty)) {
s.push(Node(x, y, dir+1)); // 当前点的下一个方向入栈
x = tx, y = ty, dir = 0; // 更新当前点的坐标和方向
mark[x][y] = 1;
cout << "(" << x << "," << y << ")" << endl;
break;
} else {
dir++; // 尝试下一个方向
}
}
}
return false;
}
int main() {
cin >> n >> m >> sx >> sy >> tx >> ty;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> maze[i][j];
mark[i][j] = 0; // 初始化标记数组
}
}
if (!dfs()) {
cout << "No solution!" << endl;
}
return 0;
}
```
上面的程序中,我们使用了一个 `Node` 结构体来表示每个节点,其中包括节点的坐标和方向。我们使用栈来存储节点,并使用深度优先搜索算法进行搜索。在搜索过程中,我们不断尝试当前点的下一个方向,如果可以走就入栈,并更新当前点的坐标和方向,否则就尝试下一个方向。如果最终找到了出口就返回 true,否则返回 false。
阅读全文