寻找迷宫路径其实就是遍历每一个可能的路径,碰到能够成功的路径就返回。
bool findPath()
{//寻找一条从入口(1,1)到达出口(size,size)的路径
//如果找到,返回true,否则返回false
path=new arrayStack<position>;
//初始化偏移量
position offset[4];
offset[0].row=0;offset[0].col=1;//右
offset[1].row=1;offset[1].col=0;//下
offset[2].row=0;offset[2].col=-1;//左
offset[3].row=-1;offset[3].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=1;
here.col=1;
maze[1][1]=1;//防止回到入口
int option=0;//下一步
int 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)
{移动maze[r][c]
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.row-here.row;//向左或者向右
here=next;
}
}
return true;
}
我们来理一下程序的思路,前面的造墙和方向偏移就不说了,主要说找路径的核心代码,首先从入口开始走,有上下左右四个方向,然后开始对四个方向进行遍历,发现第0个方向即右不通于是走下,通了然后将之前的位置设置为墙防止走回来,然后继续选择右行,不行在opetion++下行,然后将之前的地方设置为1,反之走回来,然后继续,发现option用完了,都走不通,于是删除path最顶上的那个点,回退到上一个点,并接着之前的方向进行遍历,发现往左能走,于是走到左并将之前的点置一(虽然已经是1了),发现还是走不通,于是在回退,继续遍历,发现还是走不通,在退一格,在继续遍历,然后继续走,能走就走,不能走就回退。总能找到一条路。
以上全部为我yy的,为了让程序更容易理解。