思路:
(1)首先为了解决边界问题在一个矩形迷宫的四周围上“一堵墙”,然后不能走,这样就不用特殊处理边界问题了:
(2)对迷宫的各个元素可以用一个bool型的二维数组表示,这样可以减少占用的内存空间,0表示可以走,1表示不可以走;
(3)对每一个迷宫位置表示为(i,j),对应的矩阵表示为maze[i][j];
(4)每个位置相邻有四个方向,每次要选择一个可以走得通没有障碍物的方向行走。所以需要建立一个表示不同方向的变量,且不同方向对矩阵行列的偏移量不同:
(5)每次走过的位置要入栈,然后当走不通时,如果没到达出口,就从一个一个退栈重新选择方向
bool findpath()
{
path=new arraystack<position>;
position offset[4];//定义不同走向时的偏移量
offset[0].row=0;offset[o].col=1;//右
offset[1].row=1;offset[o].col=0;//下
offset[2].row=0;offset[o].col=-1;//左
offset[3].row=-1;offset[o].col=0;//上
//初始化外围的墙
for(int i=0;i<=size+1;i++)
{
maze[0][i]=maze[size+1][i]=1;
maze[i][0]=maze[i][size+1]=1;
}
position here;//当前位置,初始化为入口
here.row=here.col=1;
maze[1][1]=1;
//定义变量表示四中不同走向
int option=0,lastoption=3;
//开始寻址
while(here.row!=size||here.col!=size)
{
int r,c;
while(option<=lastoption)//下一步的走向
{
r=here.row+offset[option].row;//下一步的行数
c=here.col+offset[option].col;//下一步的列数
if(maze[r][c]==0)break;//如果此次选择的方向下一个位置通,则结束循环,否则继续改变方向寻找能走通的方向
option++;
}
if(option<=lastoption)//当能找到通的下一路位置
{
//把当前位置移入路径栈中
path.push(here);
here.row=r;
here.col=c;
maze[r][c]=1;//此位置已走标记为阻塞
option=0;
}
else//当此位置四个方向都走不通时,把这个位置退栈,从前一位置改变方向找出路
{
if(path->empty())
return false;//无路可退
position next=path.top();
path.pop();
if(next.row=here.row)
option=2+next.col-here.col;
else option=3+next.ro-here.row;
here=next;
}
}
return true;
}