现在的位置: 首页 > 综合 > 正文

递归求解迷宫问题

2013年10月18日 ⁄ 综合 ⁄ 共 1045字 ⁄ 字号 评论关闭

前面已经介绍了迷宫的存储等一些准备工作,这篇博客就只是介绍利用递归思想解决迷宫问题。递归有几个要义:知道在函数的哪里调用自身进行递归,换句话说就是递归的条件是什么,然后递归的出口是什么。

最开始当前位置记录的是起始位置,然后利用循环有顺序的去判断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;   大笑

抱歉!评论已关闭.