鱼C论坛

 找回密码
 立即注册
查看: 8152|回复: 56

[技术交流] python小练习(055):回溯法(深度优先搜索)与探索法(广度优先搜索)求解迷宫问题

[复制链接]
发表于 2017-1-1 20:32:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jerryxjr1220 于 2017-2-7 11:26 编辑

之前已经有好多帖子讨论过“迷宫问题”了,解法也各有千秋。

今天闲来无事又琢磨了一种“字典+递归的回溯算法”(深度优先搜索算法),供大家参考。

解题思路:
利用字典把所有可能的路径列出来,利用递归算法逐层从字典中把路径找出来。

其他的看注解吧,写得很详细了。

举例:
迷宫为:(0为墙,1为路,起始(0,0),终点(3,5))
  1. maze = [
  2. #start (0,0)
  3. [1 ,0, 1, 0, 0, 0],
  4. [1, 1, 1, 1, 0, 1],
  5. [0, 0, 1, 0, 1, 0],
  6. [1, 0, 1, 0, 1, 1],#End (3,5)
  7. [1, 1, 1, 1, 1, 1],
  8. [0, 1, 0, 1, 0, 0],
  9. [0, 1, 0, 1, 1, 1]]
复制代码


程序输出:(正确路径用“8”标记出来了)
  1. Done!
  2. The right way marked "8"!
  3. [8, 0, 1, 0, 0, 0]
  4. [8, 8, 8, 1, 0, 1]
  5. [0, 0, 8, 0, 1, 0]
  6. [1, 0, 8, 0, 1, 8]
  7. [1, 1, 8, 8, 8, 8]
  8. [0, 1, 0, 1, 0, 0]
  9. [0, 1, 0, 1, 1, 1]
  10. [Finished in 0.2s]
复制代码


源代码:
游客,如果您要查看本帖隐藏内容请回复


另外一种探索解法(广度优先搜索算法):
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-1 20:38:01 | 显示全部楼层
只要有合适的解法,像这种复杂的迷宫问题,对计算机来说,也是小case,要人眼来看几乎是不可能完成的任务。

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-1 21:37:02 | 显示全部楼层
可以可以,楼主好厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-2 16:50:49 | 显示全部楼层
学习学习,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-30 18:22:23 | 显示全部楼层
学习下!!!嘻嘻~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-2 17:35:16 | 显示全部楼层
  1. #回溯加递归
  2. maze = [
  3. [1 ,0, 1, 0, 0, 0],
  4. [1, 1, 1, 1, 0, 1],
  5. [0, 0, 1, 0, 1, 0],
  6. [1, 0, 1, 0, 1, 1],
  7. [1, 1, 1, 1, 1, 1],
  8. [0, 1, 0, 1, 0, 0],
  9. [0, 1, 0, 1, 1, 1]]

  10. move = [(1,0),(-1,0),(0,1),(0,-1)]
  11. way = {(0,0):(-1,-1)}
  12. cpos = [0,0]
  13. final = [3,5]
  14.    
  15. def Stra(cpos):
  16.     for each in move:
  17.         x = cpos[0] + each[0]
  18.         y = cpos[1] + each[1]
  19.         if 0 <= x <= 6 and 0 <= y <= 5 and (x,y) not in way:
  20.             if maze[x][y] == 1:
  21.                 if final == [x,y]:
  22.                     return 1
  23.                 else:
  24.                     maze[x][y] = 8
  25.                     way[(x,y)] = (cpos[0],cpos[1])
  26.             else:
  27.                 continue
  28.         else:
  29.             continue
  30.         if Stra([x,y]) == 1:
  31.             return 1
  32.         else:
  33.             continue
  34.     maze[cpos[0]][cpos[1]] = 1
  35.     way.pop((cpos[0],cpos[1]))
  36.     return 0

  37. def main():
  38.     if Stra(cpos) == 1:
  39.         maze[3][5] = 8
  40.         for each in maze:
  41.             print(each)
  42. main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-2 20:11:13 | 显示全部楼层

这题会解了那就来做做“欧拉计划的81~83题”吧,同样的最优路径搜索问题,应该也可以解了。
81、82题可以用动态规划,83题DFS或者BFS
http://bbs.fishc.com/thread-74713-1-3.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 17:57:53 | 显示全部楼层
jerryxjr1220 发表于 2017-3-2 20:11
这题会解了那就来做做“欧拉计划的81~83题”吧,同样的最优路径搜索问题,应该也可以解了。
81、82题可 ...

81跟82已经做出来了 还差83
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 17:58:45 | 显示全部楼层
jerryxjr1220 发表于 2017-3-2 20:11
这题会解了那就来做做“欧拉计划的81~83题”吧,同样的最优路径搜索问题,应该也可以解了。
81、82题可 ...

我觉得欧拉计划里面倒是很多有关数论的题目真的挺头大的 数学知识差不多都忘关了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 18:43:26 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-5 20:41:48 | 显示全部楼层
Jonin616 发表于 2017-3-5 17:58
我觉得欧拉计划里面倒是很多有关数论的题目真的挺头大的 数学知识差不多都忘关了


欧拉计划本来就是偏数学理论和算法的题目,其实和python没多大关系,很多解题者用的也根本不是python语言,只是python比较容易使用,所以比较受欢迎而已。
81和82是动态规划算法,用时都很短(<0.5 sec),83题才是搜索算法,不过如果你理解了上述的算法也挺简单的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 20:58:01 | 显示全部楼层
jerryxjr1220 发表于 2017-3-5 20:41
欧拉计划本来就是偏数学理论和算法的题目,其实和python没多大关系,很多解题者用的也根本不 ...

最近除了在学数据结构与算法之外还在考虑应该学python的哪个方向 因为python的生态圈太庞大了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-8 21:00:58 From FishC Mobile | 显示全部楼层
Jonin616 发表于 2017-3-8 20:58
最近除了在学数据结构与算法之外还在考虑应该学python的哪个方向 因为python的生态圈太庞大了

看你的兴趣是什么了,python无所不能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 22:34:48 | 显示全部楼层
jerryxjr1220 发表于 2017-3-8 21:00
看你的兴趣是什么了,python无所不能

主要是不懂要哪个方向 之前是学了linux 和MySQL 因为python在运维方面用得挺多才来学Python的,现在想往web开发方向学习 你知道需要掌握哪些东西么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 09:14:55 | 显示全部楼层
Jonin616 发表于 2017-3-8 22:34
主要是不懂要哪个方向 之前是学了linux 和MySQL 因为python在运维方面用得挺多才来学Python的,现在想往w ...

web开发的话,Django、Flask、数据库、selenium这些都需要的,其实做web最关键还是要把java学好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 10:26:00 | 显示全部楼层
jerryxjr1220 发表于 2017-3-9 09:14
web开发的话,Django、Flask、数据库、selenium这些都需要的,其实做web最关键还是要把java学好

web开发一定要触及到Java么? s话实话对java实在不感兴趣
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 11:23:12 | 显示全部楼层
Jonin616 发表于 2017-3-9 10:26
web开发一定要触及到Java么? s话实话对java实在不感兴趣

但是做一个稍微能看的web,你肯定绕不开javascript的呀,除非你自己搞个其他脚本语言,还要能被广大互联网用户普遍接受的,因为客户端的解析器(浏览器)不在你这边,这是不受你控制的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 15:54:53 | 显示全部楼层
不错  学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-18 20:31:22 | 显示全部楼层
学习一下~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 14:53:32 | 显示全部楼层
本帖最后由 WelanceLee 于 2017-6-13 14:54 编辑

  1. # start = (0, 0)
  2. # end = (3, 5)

  3. maze = [
  4. [1 ,0, 1, 0, 0, 0],
  5. [1, 1, 1, 1, 0, 1],
  6. [0, 0, 1, 0, 1, 0],
  7. [1, 0, 1, 0, 1, 1],
  8. [1, 1, 1, 1, 1, 1],
  9. [0, 1, 0, 1, 0, 0],
  10. [0, 1, 0, 1, 1, 1]]

  11. c = [[0]*6 for i in range(7)]
  12. moves = [(1, 0), (0, 1), (-1, 0), (0, -1)]
  13. s = [(0, 0)]
  14. c[0][0] = 1
  15. a = {}
  16. while True:
  17.     location = s.pop(0)
  18.     if location == (3, 5):
  19.         break
  20.     for m in moves:
  21.         x = location[0] + m[0]
  22.         y = location[1] + m[1]
  23.         if -1< x < 7 and -1 < y < 6 and maze[x][y] == 1 and c[x][y] == 0:
  24.             c[x][y] = 1
  25.             s.append((x, y))
  26.             a[(x, y)] = m

  27. location = (3, 5)
  28. l = [location]
  29. while location != (0, 0):
  30.     x = location[0] - a[location][0]
  31.     y = location[1] - a[location][1]
  32.     location = (x, y)
  33.     l.insert(0, location)

  34. print(l)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表