zoukankan      html  css  js  c++  java
  • 迷宫问题

    可以从四个方向走:

    最简单的办法:完全4叉树(不做任何标记)

    防止往回走:效率要高点(已经走过的点标记为1)(这样一定可以找出通路,如果一条分支里找到了通路,其他点没有必要再访问这些点,因为通路已经找到了,如果没有找到,则更不用访问这些点,因为这些点绝对走不通)

    这里有一个重要结论:A到B点走不通,那么C到B也绝对走不通)

    要找到迷宫的所有路径:标记为1的,再标记回来(整个迷宫可能存在多条通路,这些通路可能经过相同的点

    DFS只能得到局部解,要想得到最优解需要遍历说有的情况。而BFS一次就可以得到最优解,但这是有前提的,每次操作的代价都相同。

    广度优先搜索法的显著特点是:
    (1)在产生新的子结点时,深度越小的结点越先得到扩展,即先产生它的子结点。为使算法便于实现,存放结点的数据库一般用队列的结构。
    (2)无论问题性质如何不同,利用广度优先搜索法解题的基本算法是相同的,但数据库中每一结点内容,产生式规则,根据不同的问题,有不同的内容和结构,就是同一问题也可以有不同的表示方法。
    (3)当结点到根结点的费用(有的书称为耗散值)和结点的深度成正比时,特别是当每一结点到根结点的费用等于深度时,用广度优先法得到的解是最优解,但如果不成正比,则得到的解不一定是最优解。这一类问题要求出最优解,一种方法是使用后面要介绍的其他方法求解,另外一种方法是改进前面深度(或广度)优先搜索算法:找到一个目标后,不是立即退出,而是记录下目标结点的路径和费用,如果有多个目标结点,就加以比较,留下较优的结点。把所有可能的路径都搜索完后,才输出记录的最优路径。
    (4)广度优先搜索算法,一般需要存储产生的所有结点,占的存储空间要比深度优先大得多,因此程序设计中,必须考虑溢出和节省内存空间得问题。
    (5)比较深度优先和广度优先两种搜索法,广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索算法法要快些。
    总之,一般情况下,深度优先搜索法占内存少但速度较慢,广度优先搜索算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。因此在选择用哪种算法时,要综合考虑。决定取舍

    迷宫问题的基本例子: 

    https://blog.csdn.net/mikasa3/article/details/51010869

    补充

    在这里我要仔细说一下回溯的概念:

    实现深度优先搜索一般有两种方式:递归方式,非递归方式。

    递归方式是通过系统栈实现的,非递归方式是通过手动维护的栈实现的。两者的区别在于后继节点入栈方式。递归方式是一次只让一个后继节点入栈,而非递归方式则是让当前节点的全部后继节点入栈。而一次只让一个后继节点入栈的方式就叫回溯

  • 相关阅读:
    查詢一個表中的所有字段,一个表的结构
    二月份工作總結
    导出excel [原创]
    一个it老总对于新人的一点建议
    命名空间的别名
    mssql 格式化时间 [转]
    开发人员一定要加入收藏夹的网站
    sql 导出/入Excel
    hibernate中hbm文件中inverse功能
    详细展示Asp.net页面的生命周期[转]
  • 原文地址:https://www.cnblogs.com/mlgjb/p/10088564.html
Copyright © 2011-2022 走看看