关于BFS迷宫问题的一点总结
程序员文章站
2022-05-20 21:34:22
...
可以解决的体型包括:1、输出最短路径
2、判断是否存在最短路径
3、出入口位置可以任意给
/*
寻找是否存在最短路径
输出最短路径
判断有多少种走法(这个期望还没有好的方法实现,在以后的学习中会进行实现)
采用BFS算法
入口与出口的位置可以指定
*/
#include<iostream>
#include<cstdio>
using namespace std;
#define max 100
int map[max][max]; //保存地图信息
int arr[max][max]; //如果地图信息为char类型,标记是否走过
int rear; //队首
int head; //队尾
int m,n; //地图行列值
int court; //步数计数器
bool flag; //判断是否存在最短路径
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
struct code{
int x; //坐标与角标
int y;
int pre;
}queue[max],end; //队列
void Court(int p){
if(p!=-1){
court++;
Court(queue[p].pre);
cout<<queue[p].x<<" "<<queue[p].y<<endl;
}
}
void bfs(int x,int y){
int a,b;
while(head<rear){
for(int i=0;i<4;i++){
a=queue[head].x+dx[i];
b=queue[head].y+dy[i];
if(a<0||b<0||a>=m||b>=n||map[a][b]==1){
continue;
}
else{
map[a][b]=1;
queue[rear].x=a;
queue[rear].y=b;
queue[rear].pre=head;
rear++; //入队
}
if(a==end.x&&b==end.y){
end.pre=head;
flag++;
break;
}
}
head++; //出队
}
//根据情况进行输出
if(flag!=0){
cout<<"最短路径如下"<<endl;
Court(end.pre);
cout<<end.x<<" "<<end.y<<endl;
cout<<"最少步数是"<<" "<<court<<endl;
}
else{
cout<<"没有可行路径"<<endl;
}
}
int main(){
cout<<"Please enter the number of m and n."<<endl;
cin>>m>>n;
cout<<"Please enter the data of map."<<endl;
for(int i=0; i<m; i++)//输入地图信息,记录出入口位置,并将入口位置放入队列
for(int j=0; j<n; j++){
cin>>map[i][j];
if(map[i][j]==2){
queue[0].x=i;
queue[0].y=j;
queue[0].pre=-1;
}
if(map[i][j]==3){
end.x=i;
end.y=j;
}
}
head=0;
rear=1;
flag=0;
bfs(queue[0].x,queue[0].y);
return 0;
}
上一篇: 关键路径
下一篇: 迷宫问题(BFS)——数据结构实习