迷宫问题:深度优先搜索和广度优先搜索

1、深度优先搜索可以使用栈实现,栈顶元素为当前节点

2、当前节点搜索下一节点,判断节点是否走得通,如果走得通任意方向走一步,走不通一直弹出栈内元素,直到走得通

3、当前节点如果等于(x2,y2)说明搜索结束,已找到出口

4、对于每一个走过的路径都要标记为另一个数,便于下次不能搜索到

一、深度优先搜索

maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
dirs = [lambda x, y: (x - 1, y),lambda x, y: (x + 1, y),lambda x, y: (x, y - 1),lambda x, y: (x, y + 1)]# 深度有优先搜索
def maze_path(x1, y1, x2, y2):'''(x1,y1)代表起点,(x2,y2)代表终点'''global nextNodestack = []stack.append((x1, y1))  # 开始时候起点进栈while len(stack) > 0:  # 只要栈不空代表还可以继续搜素curNode = stack[-1]  # 栈顶的元素为当前的路径if curNode[0] == x2 and curNode[1] == y2: # 走到终点for p in stack:print("找到的路径为:", p)return True# 向四个方向搜索,上下左右,找到下一个可以走的节点for dir in dirs:nextNode = dir(curNode[0], curNode[1])# 如果有一个方向上为0则说明可以按照该方向继续走if maze[nextNode[0]][nextNode[1]] == 0:stack.append(nextNode)maze[nextNode[0]][nextNode[1]] = 2  # 标志为2说明当前节点走过了,找到一个可以走的点就结束break  # 跳出for的循环,只要栈不空就进入下一次寻找方向else:maze[nextNode[0]][nextNode[1]] = 2 # 没找到路也要标记,并把栈中的元素弹出stack.pop()else:print("没有路")return False

二 、广度优先搜索

1、广度优先搜素使用队列实现,但是队列实现时队内只保留当前路径的最后一个节点,所以队空了说明没有路可以走了

2、每次走下一步时需要一个列表把当前节点的上一个节点存下来,最后通过回溯找到该节点所在的路径

3、回溯函数要单独来写,判断的条件只要不是起始点就一直往回找,并把节点单独存放到一个列表中

4、如此找到的节点保存到realPath中是从终点到起点的,将列表逆序之后找到的就是该条路径

5、当找到路的时候,终点也会被放到path里,所以path的最后一个元素就是终点,回溯的时候就是通过终点往回找的

6、path里边放的是所有出队的节点,但是只有一条路径是最后到了终点的路径,根据回溯找到那条路径上所有的节点

from collection import deque
# 路径回溯函数
def print_path(path):curNode = path[-1]realPath = []while curNode[2] != -1:  # curNode[2] == -1 代表搜索到了起始位置realPath.append(curNode[0:2])  # curNode的前两个存放的就是真实走过的路径curNode = path[curNode[2]]# while循环结束将起点加入到路径中realPath.append(curNode[0:2])realPath.reverse() # 当前路径为终点到起点,列表反转# print(realPath)for p in realPath:print(p)def maze_path_deque(x1, y1, x2, y2):queue = deque()  # -1代表起点的前一个节点的下标queue.append((x1, y1, -1))path = []  # 把出队的节点存起来,下一个节点回溯找到走过的路while len(queue) > 0:curNode = queue.pop()path.append(curNode)if curNode[0] == x2 and curNode[1] == y2:print_path(path)return Truefor dir in dirs:nextNode = dir(curNode[0], curNode[1])if maze[nextNode[0]][nextNode[1]] == 0:queue.append((nextNode[0], nextNode[1], len(path) - 1)) # 后续节点进队,记录是由哪一个节点出队使它进队的# 标记走过的路线maze[nextNode[0]][nextNode[1]] = 2else:print("没有路")return False

三、广度优先搜索(myself)

from collections import dequemaze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
dirs = [lambda x, y: (x - 1, y),lambda x, y: (x + 1, y),lambda x, y: (x, y - 1),lambda x, y: (x, y + 1)]# 深度优先搜索实现队列,找到最短的路径
# 返回路径
def print_path(path):curNode = path[-1]real_path = []# 只要没有到起点,弹出没一个节点的下标while curNode[2] != -1:real_path.append(curNode[0:2])curNode = path[curNode[2]]real_path.append(curNode[0:2])  # 如果是起点的话将起点也加进来real_path.reverse()   # 原来是终点到起点,逆序起点到终点for item in real_path:print(item)def maze_path(x1, y1, x2, y2):  # (x1,y1)代表起点,(x2,y2)代表终点stack = deque()path = []stack.append((x1, y1, -1))  # 起点进栈while len(stack) > 0:curNode = stack.pop()path.append(curNode)  # 每一个出队的都要保存下来if curNode[0] == x2 and curNode[1] == y2:# print("找到路")print_path(path)return Truefor dir in dirs:nextNode = dir(curNode[0], curNode[1])  # 计算下一个节点if maze[nextNode[0]][nextNode[1]] == 0:stack.append((nextNode[0], nextNode[1], len(path) - 1))maze[nextNode[0]][nextNode[1]] = 2else:print("没有路走")return False
``

迷宫问题:深度优先搜索和广度优先搜索相关推荐

  1. 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索

    什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...

  2. 八数码深度优先搜索_深度优先搜索和广度优先搜索

    深度优先搜索和广度优先搜索 关于搜索&遍历 对于搜索来说,我们绝大多数情况下处理的都是叫 "所谓的暴力搜索" ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所 ...

  3. 算法十——深度优先搜索和广度优先搜索

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 搜索算法 算法是作用于数据结构之上的.深度优先搜索.广度优先搜索是作用于图这种数据结构之上的.图上的搜索 ...

  4. 深度优先搜索和广度优先搜索

    深度优先搜索和广度优先搜索 ​ 在人工智能的运筹学的领域中求解与图相关的应用中,这两个算法被证明是非常有用的,而且,如需高效地研究图的基本性质,例如图的连通性以及图是否存在环,这些算法也是必不可少的. ...

  5. 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...

  6. 学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举

    目录 一. 图解二叉树的深度优先搜索 二. 二叉树的广度优先搜索  (层序遍历) 三. 打开LeetCode 撸起来 至此, 咱多少被刚刚的后序非递归搞得可能有点小晕晕的, 没事,层序简单呀....  ...

  7. 深度优先搜索与广度优先搜索区别和案例

    今天周末,心血来潮打开LeetCode做一道题: https://leetcode-cn.com/problems/number-of-enclaves/ 看到题,我的第一想法是: 从边缘的陆地开始, ...

  8. 深度优先搜索和广度优先搜索及典例分析(走迷宫问题(BFS)和棋盘问题(DFS))

    搜索算法在实际编程应用中起着举足轻重的作用,学会掌握搜索算法并熟练应用搜索算法来解决实际问题不得不说是一件相当COOL的事,所以我将深度搜索和广度搜索认真地做了详细的总结,与诸君共勉,也方便以后查阅复 ...

  9. 每天进步一点点【图的深度优先搜索与广度优先搜索】

    图是一种数据结构,其中节点可以具有零个或多个相邻元素.两个节点之间的连接称为边.节点也可以称为顶点. 图分为三种:无向图.有向图.带权图 图的表示方式有两种:二维数组表示(邻接矩阵):链表表示(邻接表 ...

最新文章

  1. 带你100% 地了解 Redis 6.0 的客户端缓存
  2. NOIP 2018 普及组 解题报告
  3. 架构设计:远程调用服务架构设计及zookeeper技术详解(上篇)
  4. (网页)AngularJS 参考手册
  5. php中get_featured_posts()是什么意思,WordPress的Get_Posts()函数详解
  6. 系统建模、分析、仿真和验证软件工具ModelCodoer
  7. 边缘检测之Canny
  8. linux系统上手工建库步骤,Linux下Oracle手工建库过程
  9. 码表的理解(ASCII,GBK,Unicode,UTF-8等)。
  10. 【OpenCV】分离多通道图像RGB的值
  11. Find n‘th number in a number system with only 3 and 4
  12. Java编写网络爬虫
  13. Tcl学习2——Tcl语言语法
  14. 应用html的DIV+CSS制作牛顿摆
  15. php 文章分句,php 英文分句/分段落
  16. COCOS CREATOR(TS)相对坐标转世界坐标
  17. Memcached优化
  18. linux操作系统简介与发展史
  19. QT 5.3.2 + VC2012 中文乱码 完美解决方案
  20. 校园计算机网的功能,校园网的含义及其特点和基本功能

热门文章

  1. 《数据分析变革:大数据时代精准决策之道》一2.3 纵观全局看待大数据
  2. 如何运行c语言so文件,SO的创建及使用
  3. RPA「C位」卷王,5行代码搞定订单自动发货!
  4. 深入理解Python元类(原创)
  5. 学计算机用微软笔记本可以吗,想选个能陪伴大学四年的笔记本?Surface Laptop 3别错过...
  6. FlyAI资讯:Uber正式开源分布式机器学习平台:Fiber
  7. 饿了么薅羊毛时刻正式开启
  8. vue 跳转到本地的html文件预览pdf
  9. 安装centos系统,搭建LAMP服务器并使其外网可见
  10. Old Bill(枚举)