前面已经介绍了迷宫的存储等一些准备工作,这篇博客就只是介绍利用递归思想解决迷宫问题。递归有几个要义:知道在函数的哪里调用自身进行递归,换句话说就是递归的条件是什么,然后递归的出口是什么。
最开始当前位置记录的是起始位置,然后利用循环有顺序的去判断8各分支是否可走,如果可以那么就将这下一个位置的行和列传入函数本身,进行递归了。如果下一个位置不行,那么在跳转在下一个方向,还有就是如果一个位置上8个方向都没有出路,那就当前调用层函数就无果而返了,返回到到递归的入口处,回到了上一层,接着下一个方向继续循环。
下面直接贴出递归的算法:
int Maze::SeekPath(int current_row,int current_col)
{
int next_row,next_col;//下一次将要移动的坐标值
string next_direction;//方向值 属临时存储变量
if(current_row == exit_row && current_col == exit_col)//如果当前坐标值与指定迷宫出口坐标值一致
return 1;//则递归结束
for(int i = 0;i < 8; i++)//8个分支的循环 试探可行分支
{
next_row = current_row + Move[i].move_branch_row;
next_col = current_col + Move[i].move_branch_col;
next_direction = Move[i].direction;//换下一个方向 继续试探
if(maze[next_row][next_col] == 0 && mark[next_row][next_col] == 0)//下一个分支可行 试探
{
mark[next_row][next_col] = 1;//把可行的这一个标志矩阵置为1 表示已经走过
if(SeekPath(next_row,next_col))
{
cout<<"("<<next_row<<","<<next_col<<"),"
<<"Direction:"<<next_direction<<","<<endl;
return 1;
}
}//if条件判断右括号
//if判断不成立 则换个移动分支方向继续进行
}//for循环右括号
if(current_row == begin_row && current_col == begin_col)//当前坐标值 仍为进口坐标值
cout<<"no path Maze"<<endl;
return 0;//运行到此 没发现迷宫出口
}
That's All;