拯救大兵瑞恩(深搜模板)

拯救大兵瑞恩

(当然啦,不是电影)
题目是这样的

有一天,大兵瑞恩在穿越亚马逊丛林时迷路了,他的好友凯西得知后准备去拯救瑞恩,凯西搞到了亚马逊丛林的地图,决定快速去拯救瑞恩……
亚马逊丛林由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是大树,你的任务是帮助凯西找到一条从起点到瑞恩所在位置的最短路径,注意大树是不能通过的,当然凯西也不能走到丛林外边。
首先,我们可以用一个二维数组来存储这个丛林,刚开始的时候,凯西处于丛林的入口处(1,1),瑞恩在(p,q)。其实,就是找一条从(1,1)到(p,q)的最短路径。如果你是凯西,你该怎么办呢?凯西最开始在(1,1),他只能往右走或者往下走,但是凯西究竟是该往下走还是往右走呢?他只能一个一个地去尝试。我们可以先让凯西往右走,直到走不通的时候再回到这里,再去尝试另外一个方向。我们这里规定一个顺序,按照顺时针方向来尝试(即按照右、下、左、上的顺序去尝试)。
我们先来看看凯西一步之内可以到达的点有哪些?只有(1,2)和(2,1)。根据刚才的策略,我们先往右边走,凯西来到了(1,2)这个点,来到(1,2)这个点之后凯西又能到达哪些新的点呢?只有(2,2)这个点,因为(1,3)这个大树是无法到达的,(1,1)是刚才来的路径已经走过的点,也不能走,所以只能到(2,2)这个点,但是瑞恩并不在这个点上,所以凯西还得继续往下走,直至无路可走或者找到瑞恩为止。请注意,此处不是一找到瑞恩就结束了,因为刚才只尝试了一条路,而这条路并不一定是最短的。刚才
很多地方在选择方向的时候都有多种选择,因
此我们需要返回到这些地方继续尝试往别的方
向走,直到把所有可能都尝试一遍,最后输出
最短的一条路径。

如下图所示:
在这里插入图片描述
右图就是一种可行的搜索路径。
现在我们尝试用深度优先搜索来实现
这个方法。先来看dfs()函数如何写。
dfs()函数的功能是解决当前怎么办。
当凯西处在某个点的时候需要处理的
是:先检查凯西是否已经到达瑞恩的
位置,如果没有到达则找出下一步可以
走的地方。为了解决这个问题,此处dfs()函数只需要维护
3个参数,分别是当前这个点的x坐标、y坐标以及当前已经走过的步数step。dfs()函数定义如下:

void  dfs(int x,int y,int step)
{
   
	return;
}
/*判断是否已经到达瑞恩的位置这一点很好实现,只需要判断当前的坐标和瑞恩的
坐标是否相等就可以了,如果相等则表明已经到达瑞恩的位置了。如下:*/
void  dfs(int x,int y,int step)
{
   
	if(x==p&&y==q)
	{
   
	        if(step<minn)    minn=step;
	        return;
	}
	return;
}

如果没有到达瑞恩的位置,则找出下一步可以走地方。因为有四个方向可以走,根据
我们之前的约定,按照顺时针的方向来尝试(即

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值