迷宫的递归回溯算法c++
时间: 2023-12-06 11:00:15 浏览: 49
下面给出一个基于递归回溯算法的C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <stack>
#include <ctime>
#include <cstdlib>
using namespace std;
const int N = 1010;
int n, m; // 迷宫的行数和列数
int maze[N][N]; // 迷宫地图
int vis[N][N]; // 标记是否访问过某个点
// 定义四个方向
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
// 判断某个点是否在迷宫内
bool inMaze(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m;
}
// 随机生成迷宫地图
void generateMaze() {
srand(time(0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
maze[i][j] = rand() % 2; // 随机生成0或1
}
}
maze[0][0] = maze[n - 1][m - 1] = 0; // 迷宫入口和出口不能是障碍物
}
// 递归回溯求解迷宫
bool dfs(int x, int y) {
if (x == n - 1 && y == m - 1) return true; // 找到出口
vis[x][y] = 1; // 标记当前点为已访问
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (inMaze(nx, ny) && maze[nx][ny] == 0 && !vis[nx][ny]) { // 判断是否可以走到下一个点
if (dfs(nx, ny)) return true; // 递归搜索下一个点
}
}
return false; // 找不到出口
}
int main() {
cin >> n >> m;
generateMaze();
cout << "迷宫地图:" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maze[i][j] << " ";
}
cout << endl;
}
cout << "是否有解:" << (dfs(0, 0) ? "是" : "否") << endl;
return 0;
}
```
在这个代码中,我们先随机生成一个迷宫地图,然后从入口开始使用递归回溯算法搜索迷宫。在搜索过程中,我们使用一个二维数组 `vis` 记录每个点是否访问过,确保不会重复访问同一个点。如果找到了出口,则返回 true;否则,返回 false。最后输出是否有解。