二维整数矩阵a[N][N]表示一个迷宫,矩阵左上角表示迷宫入口,右下角表示出口。矩阵的元素为0表示可以通过,为1表示不能够通过。如
maze[5][5]=
{0, 1, 1, 1, 1,
0, 0, 0, 0, 0,
0, 1, 0, 1, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0};
则迷宫的一条通往出口的路径为(0, 0)->(1, 0)->(2, 0)->(3, 0)->(4, 0)->(4, 1)->(4, 2)->(4, 3)->(4, 4)。
设计一个算法,通往迷宫出口的最短路径。
可以使用BFS算法。BFS算法找到的第一条通往出口的路径就是所求的最短路径。
代码如下所示:
#include<iostream>
#include<deque>
using namespace std;
class Point
{
public:
int i;
int j;
Point(int x, int y)
{
i=x;
j=y;
}
};// 节点坐标结构体
deque<Point> q;// BFS需要的队列
int N=5;
int maze[5][5]=
{0, 1, 0, 0, 0,
0, 0, 0, 1, 0,
1, 0, 1, 1, 0,
0, 0, 0, 1, 0,
0, 1, 0, 0, 0};// 迷宫矩阵,0表示可走,1表示不可走
int path[5][5]=
{-1, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0};// path[i][j]存放maze[i][j]的父节点的位置,1、2、3、4分别表示父节点位于maze[i][j]的上下左右方向,path[0][0]标记为-1作为路径打印的终止标志
// 1--上;2--下;3--左;4--右
int main()
{
q.push_back(Point(0, 0));
bool flag=false;
while(!q.empty())
{
Point p=q.front();
q.pop_front();
//cout<<p.i<<", "<<p.j<<endl;
if(N-1==p.i && N-1==p.j)
{
flag=true;
int m=p.i, n=p.j;
cout<<"path out:"<<endl;
cout<<m<<", "<<n<<endl;
/* for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
cout<<path[i][j]<<" ";
}
cout<<endl;
}*/
while(-1!=path[m][n])
{
switch(path[m][n])
{
case 1:
cout<<--m<<", "<<n<<endl;
break;
case 2:
cout<<++m<<", "<<n<<endl;
break;
case 3:
cout<<m<<", "<<--n<<endl;
break;
case 4:
cout<<m<<", "<<++n<<endl;
break;
default:
break;
}
}
break;
}
if(p.i>0 && 1!=maze[p.i-1][p.j] && 0==path[p.i-1][p.j])
{
//cout<<"1"<<endl;
path[p.i-1][p.j]=2;
q.push_back(Point(p.i-1, p.j));
}
if(p.i<N-1 && 1!=maze[p.i+1][p.j] && 0==path[p.i+1][p.j])
{
//cout<<"2"<<endl;
path[p.i+1][p.j]=1;
q.push_back(Point(p.i+1, p.j));
}
if(p.j>0 && 1!=maze[p.i][p.j-1] && 0==path[p.i][p.j-1])
{
//cout<<"3"<<endl;
path[p.i][p.j-1]=4;
q.push_back(Point(p.i, p.j-1));
}
if(p.j<N-1 && 1!=maze[p.i][p.j+1] && 0==path[p.i][p.j+1])
{
//cout<<"4"<<endl;
path[p.i][p.j+1]=3;
q.push_back(Point(p.i, p.j+1));
}
}
if(!flag)
cout<<"no path out!"<<endl;
system("pause");
}