递归求解迷宫问题

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值