用C++实现下面问题:使用回溯算法解决迷宫问题 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1)根据二维数组,输出迷宫的图形。 (2)探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。 运行示例: 请输入迷宫的行数 9 请输入迷宫的列数 8 请输入9行8列的迷宫 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 有路径 路径以下:# # 1 0 0 0 1 0 0 # 1 0 0 0 1 0 # # 1 0 1 1 0 1 # 1 1 1 0 0 1 0 # # # 1 # # # 0 0 1 # # # 1 # 1 0 1 1 1 1 0 # 1 1 1 0 0 0 1 # 1
时间: 2024-01-01 18:03:58 浏览: 60
以下是C++代码实现:
```cpp
#include<iostream>
#include<vector>
using namespace std;
const int MAXN = 100;
int n, m;
int maze[MAXN][MAXN];
bool vis[MAXN][MAXN];
vector<pair<int,int>> path; // 记录路径
void input_maze(){
cout<<"请输入迷宫的行数:";
cin>>n;
cout<<"请输入迷宫的列数:";
cin>>m;
cout<<"请输入"<<n<<"行"<<m<<"列的迷宫(0表示通路,1表示障碍):"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>maze[i][j];
}
}
}
void print_maze(){
cout<<"迷宫如下:"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
}
bool dfs(int x, int y){
if(x<0 || x>=n || y<0 || y>=m) return false; // 越界
if(maze[x][y] || vis[x][y]) return false; // 障碍或已访问
vis[x][y] = true; // 标记为已访问
path.push_back({x,y}); // 记录路径
if(x==n-1 && y==m-1) return true; // 找到出口
if(dfs(x+1,y) || dfs(x,y+1) || dfs(x-1,y) || dfs(x,y-1)) return true; // 向四个方向探索
path.pop_back(); // 回溯
return false;
}
void output_path(){
if(path.empty()){
cout<<"没有路径"<<endl;
return;
}
cout<<"有路径,路径以下:"<<endl;
for(int i=0;i<path.size();i++){
cout<<"# ";
cout<<path[i].first<<" "<<path[i].second<<" ";
cout<<endl;
}
}
int main(){
input_maze();
print_maze();
if(dfs(0,0)){
output_path();
}else{
cout<<"没有路径"<<endl;
}
return 0;
}
```
运行示例:
```
请输入迷宫的行数:9
请输入迷宫的列数:8
请输入9行8列的迷宫(0表示通路,1表示障碍):
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 1 0 1 1 0 1
1 1 1 0 0 1 0 0
0 1 0 1 1 1 1 0
0 0 1 0 0 0 0 0
1 0 0 0 0 0 1 0
0 0 0 1 0 1 1 1
0 0 0 1 0 1 1 1
迷宫如下:
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 1 0 1 1 0 1
1 1 1 0 0 1 0 0
0 1 0 1 1 1 1 0
0 0 1 0 0 0 0 0
1 0 0 0 0 0 1 0
0 0 0 1 0 1 1 1
0 0 0 1 0 1 1 1
有路径,路径以下:
# 0 0
# 1 0
# 2 0
# 2 1
# 2 2
# 1 2
# 0 2
# 0 3
# 0 4
# 0 5
# 1 5
# 2 5
# 3 5
# 3 6
# 4 6
# 4 5
# 4 4
# 4 3
# 3 3
# 2 3
# 2 4
# 2 5
# 5 5
# 6 5
# 6 4
# 7 4
# 7 3
# 8 3
# 8 4
# 8 5
# 8 6
# 8 7
```
阅读全文