拯救大兵瑞恩
(当然啦,不是电影)
题目是这样的
有一天,大兵瑞恩在穿越亚马逊丛林时迷路了,他的好友凯西得知后准备去拯救瑞恩,凯西搞到了亚马逊丛林的地图,决定快速去拯救瑞恩……
亚马逊丛林由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;
}
如果没有到达瑞恩的位置,则找出下一步可以走地方。因为有四个方向可以走,根据
我们之前的约定,按照顺时针的方向来尝试(即