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

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

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个盒子里,并使得等式成立。

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

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

基本思路:

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

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

运行结果为:

时间: 2024-10-06 18:04:47

深度优先搜索[奥数等式、迷宫找人]的相关文章

广度优先(迷宫找人)

1 import java.util.LinkedList; 2 3 public class One { 4 public static void main(String args[]){ 5 int n,m,p,q;//n,m为数组实际迷宫的行列,p,q为目标地的数组行纵号 6 int a[][]=new int[51][51],book[][]=new int[51][51];//迷宫和标记数组 7 int d[][]={{0,1},{1,0},{0,-1},{-1,0}};//方向数组,

暴力的枚举法[奥数等式]

将数字1~9分别填入,每个数字只能使用一次使得等式成立.例如173+286=459就是一个合理的组合,请问一共有多少种合理的组合?注意173+286=459和286+173=459是同一种组合. 根据枚举思想我们只需要枚举每一位上所有可能的数就好了.用一个book数组来标记解决互不相等的问题. 由于173+286=459和286+173=459是同一种组合,所以结果total/2. 暴力枚举简单暴力,但是时间复杂度很高,枚举算法也叫穷举算法,基本思想就是有序的去尝试每一种可能.

&quot;《算法导论》之‘图’&quot;:深度优先搜索、宽度优先搜索及连通分量

本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步.  1. 深度优先搜索  1.1 迷宫搜索 在<算法>这本书中,作者写了很好的一个故事.这个故事让我马上理解了深度优先搜索的思想. 如下图1-1所示,如何在这个迷宫中找到出路呢?方法见图1-2. 图1-1 等价的迷宫模型 探索迷宫而不迷路的一种古老办法(至少可以追溯到忒修斯和米诺陶的传说)叫做Tremaux搜

迷宫问题 - 堆栈与深度优先搜索

堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素. 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果.那是非常大的.今天我就来介绍用深度优先搜索来解决这个数的全排列的问题. 深度优先搜索 首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样.深度优先搜索的基本模型为: dfs(step): 判断边界:执行相关操作,返回 尝试每一种可能 for( i

迷宫寻址中深度优先搜索的递归和非递归算法比较

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 本文只探究迷宫寻址中深度优先搜索的递归和非递归算法比较,其他相关代码详见<迷宫问题(巧若拙)>http://blog.csdn.net/qiaoruozhuo/article/details/41020745 深度优先搜索的递归算法是很容易实现的,只需设置一个驱动函数,然后递归调用子函数就可以了. 代码如下: int DeepSearchWay()//寻找路径:深度搜索 { CopyMiGong

unity 使用深度优先搜索生成迷宫之二

之前写过一篇使用深度优先搜索生成随机迷宫的文章 https://www.cnblogs.com/JinT-Hwang/p/9599913.html 今天做了一下优化,使用unity的TileMap来做,并且代码减少到100行以内. 先看一下效果图 下面直接是代码,至于在unity中怎么创建tilemap资源这里就不讲了: using System.Collections; using System.Collections.Generic; using UnityEngine; using Uni

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

归并排序 求逆序数 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 首先考虑下如何将将二个有序数列合并.这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数.然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可. //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c

递归之深度优先搜索

递归的思想在写程序中运用较为广泛,看视很复杂的问题,通常通过递归思想找出"递归结构",分解成重复的小步骤即可解决,但是递归的思想有时并不好理解(大佬,悟性高的忽略).本文通过介绍全排序例子介绍递归思想,最后给出前一次博客写的"坑爹的奥数"问题进行递归优化,给出执行时间. 一.问题描述:假如有编号为1.2.3的3张扑克牌和编号为1.2.3的3个盒子.现在需要将这3张扑克牌分别放到3个盒子里面,并且每个盒子有且只有一张扑克牌.那么一共有多少种不同的放法呢? 当有n个数字