还是小明找出口的问题,最开始小明在入口(1,1)处,一步可以到达的点有(1,2)和(2,1),如下:
但是出口并不在这两个点上,那么小明只能通过(1,2)和(2,1)这两个点继续往下走,比如现在小明走到了(1,2)这个点,之后他又能到达那些点呢?有(2,2)再看看通过(2,1)又可以到达哪些点呢?可以到达(2,2)和(3,1),此时也许发现(2,2)这个点既可以从(1,2)到达,也可以从(2,1)到达,并且都只使用了2步,为了防止一个点多次被走到,这里需要一个数组来记录一个点是否已经被走到过。
此时小明2步就可以走到的点就全部走到了,有(2,2)和(3,1),可是小明并不在这两个点上,没有别的办法,还得继续往下尝试,在看看通过(2,2)和(3,1)这两个点还能到达哪些没有走到过的点。通过(2,2)这个点我们可以到达(2,3)和(3,2),通过(3,1)可以到达(3,2)和(4,1),现在3步可以到达的点有(2,3),(3,2)和(4,1)依旧没有到达终点,因此重复以上办法,直到到达终点为止。
见下例:
输入: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表示迷宫的列,接下来n行m列为迷宫,0表示空地,1表示障碍物,最后一行四个数前两个表示入口,后两个表示出口,输出最短的步长。
# include <iostream>
# include <string.h>
# include <queue>
using namespace std;
struct node {
int x;
int y;
int length;
int f_x;
int f_y;
node(int x1,int y1,int length1,int f_x1,int f_y1):x(x1),y(y1),length(length1),f_x(f_x1),f_y(f_y1){}
};
int main(){
freopen("xx.txt","r",stdin);
int a[101][101];
queue<node>s;
int begin_x,begin_y,end_x,end_y,min=999;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
cin>>begin_x>>begin_y;
cin>>end_x>>end_y;
node *re= node(begin_x,begin_y,0,0,0);
s.push(*re);
while(s.empty()==false){
int fangxiang[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
for(int i=0;i<=3;i++){
int x=s.front().x+fangxiang[i][0];
int y=s.front().y+fangxiang[i][1];
if(x<1||x>n||y<1||y>m)
continue;
if(a[x][y]==0){
node *re=new node(x,y,s.front().length+1,s.front().x,s.front().y);
s.push(*re);
a[x][y]=1;
if(x==end_x&&y==end_y)
{
if(min>(s.front().length+1)){
min=s.front().length+1;
}
}
}
}
s.pop();
}
cout<<min<<endl;
return 0;
}