迷宫救援bfs解法
在一个有n行m列的单元格组成的迷宫中,0代表空地,1代表障碍物,有一名迷路者小红,还有一名救援者小明
输入n1,n2代表小明的出发位置;输入m1,m2代表小红的被困位置,
请输出小明找到小红所需的最短路途(规定一个单元格代表一个长度单位)
样例输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
样例输出:
7
在一个有n行m列的单元格组成的迷宫中,0代表空地,1代表障碍物,有一名迷路者小红,还有一名救援者小明
输入n1,n2代表小明的出发位置;输入m1,m2代表小红的被困位置,
请输出小明找到小红所需的最短路途(规定一个单元格代表一个长度单位)
样例输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
样例输出:
7
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,m1,m2;
int a[51][51],b[51][51];//储存迷宫
int book[51][51];//标记是否走过
int as[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//这个用来表示向右,向左,向下,向上;
struct note
{
int x;
int y;
int f;//这个用来标记父元素
int s;//这个是记录步数
}que1[2502];//这个用来模拟队列;
int main()
{
int n1,n2;
int head=1,tail=1;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
b[i][j]=a[i][j];
}
}
scanf("%d%d%d%d",&n1,&n2,&m1,&m2);
book[n1][n2]=1;
int jieshu=0;//这个用来标记是否结束
que1[tail].f=0;
que1[tail].s=0;
que1[tail].x=n1;
que1[tail].y=n2;
tail++;
while(head<tail){
for(int i=0;i<4;i++){
int tx=que1[head].x+as[i][0];
int ty=que1[head].y+as[i][1];
if(tx<1||tx>n||ty<1||ty>m){
continue;
}
if(a[tx][ty]==0&&book[tx][ty]==0){//判断下一步是否能走以及是否以及走过
book[tx][ty]=1;
que1[tail].f=head;//标记父元素
que1[tail].s=que1[head].s+1;
que1[tail].x=tx;
que1[tail].y=ty;
tail++;
}
if(tx==m1&&ty==m2){
jieshu=1;
break;
}
}
if(jieshu==1){
break;
}
head++;
}
cout<<que1[tail-1].s<<endl;
tail=tail-1;
b[n1][n2]=2;//2表示寻找时的路径
while(que1[tail].f!=0){
int tx=que1[tail].x;
int ty=que1[tail].y;
b[tx][ty]=2;
tail=que1[tail].f;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}