**
BFS走迷宫
**
走迷宫问题就是在一个矩阵输入的迷宫中,从开始的点找到一条路通往终点。是一个搜索+扩散+不重复路径的问题,也就是一个BFS应用的问题。
BFS得到的是图上从源点到个点的最短路径的一颗最短路径树,所以执行到最后可以得到源节点到每一个节点的最短路径长度,需要的话可以通过记录前驱的方式来构建最短路。
/*
一个BFS的应用
一个n*m的迷宫;n行m列
有的格子里有障碍物,不能走;
有的格子是空地,可以走;
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定
能走到)。只能在水平方向或垂直方向走,不能斜着走。
*/
#include<iostream>
#include<queue>
using namespace std;
struct point{
int x,y;
point(int _x,int _y){x=_x,y=_y;}
};
int m,n;//列数、行数
int sx,sy,tx,ty;//start terminal
int a[10][10];//障碍物,也就是存迷宫的数组
int bfs()
{
int vis[10][10]={0};
int dis[10][10]={0};
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//组合形成向上下左右走的四种情况
queue<point> p;
p.push(point(sx,sy));
vis[sx][sy]=1,dis[sx][sy]=0;
while(!p.empty())
{
point now=p.front();
p.pop();
for(int i=0;i<4;i++)
{
int x=now.x+dx[i];
int y=now.y+dy[i];
if(x<1||y<1||x>n||y>m) continue;//走出边缘
if(vis[x][y]||a[x][y]) continue;//已经走过或者有障碍
dis[x][y]=dis[now.x][now.y]+1;//距离
vis[x][y]=1;//判断有没有走过
p.push(point(x,y));
}
}
cout<<dis[tx][ty]<<endl;
return 0;
}
//这个函数可以算出从起始点能到的所有点到起始点的最短距离,存储在dis[][]中,最后输出就可以
int main()
{
cin>>n>>m;
cin>>sx>>sy>>tx>>ty;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>a[i][j];
}
bfs();
return 0;
}
/*样例
4 5
1 1 4 5
0 1 0 0 0
0 1 0 1 0
0 1 0 1 0
0 0 0 1 0
*/