深度优先搜索[奥数等式、迷宫找人]

上一节我们用暴力枚举解决奥数等式,虽然简单,但是很蛋疼。

http://blog.csdn.net/wtyvhreal/article/details/43267867


这一节讲用深搜的方式解决,高大上。


深度优先搜索(Depth First Search,DFS),理解深搜的关键在于解决“当下该如何做”。至于“下一步如何做”则与“当下该如何做”是一样的。通常的方法就是把每一种可能都是尝试一遍。当前这一步解决后便进入下一步。下一步的解决方法和当前这步的解决方法是完全一样的。深搜的基本模型:

void dfs(int step)
{
     判断边界
     尝试每一种可能 for(i=1;i<=n;i++)
     {
          继续下一步 dfs(step+1);
     }
     返回
}

现在想想奥数等式的解决方法。

这就相当于手中有1~9张扑克牌,放到9个盒子里,并使得等式成立。

深度优先搜索[奥数等式、迷宫找人]_第1张图片

深度优先搜索[奥数等式、迷宫找人]_第2张图片

深度优先搜索[奥数等式、迷宫找人]_第3张图片


下面利用DFS解决迷宫找人问题。

情景分析,n行m列单元格组成(n,m都小于等于50),每个单元格要么是空地,要么是障碍物,任务是帮助小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。注意障碍物是不能走的,当然小哼也不能走到迷宫之外。

深度优先搜索[奥数等式、迷宫找人]_第4张图片


基本思路:

二维数组存储这个迷宫,小哼起点(1,1),小哈在(p,q)。找一条从(1,1)到(p,q)的最短路径。小哼开始只能往右走或者往下走,只能一个个去尝试。我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向。规定按照顺时针方向来尝试(按照右、下、左、上的顺序去尝试)。深搜就是一趟搜到底,没找到返回继续搜。

深度优先搜索[奥数等式、迷宫找人]_第5张图片

深度优先搜索[奥数等式、迷宫找人]_第6张图片

深度优先搜索[奥数等式、迷宫找人]_第7张图片

深度优先搜索[奥数等式、迷宫找人]_第8张图片


n表示行,m表示列,0表示空地,1表示障碍物,最后一行4个数,迷宫入口坐标,后两个为小哈坐标。

深度优先搜索[奥数等式、迷宫找人]_第9张图片


运行结果为:


你可能感兴趣的:(迷宫,DFS,深度优先搜索,深度优先遍历,奥数等式)