鱼C论坛

 找回密码
 立即注册
查看: 6164|回复: 21

[技术交流] [python解迷宫问题] 字典+递归算法

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

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

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

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

今天闲来无事又琢磨了一种“字典+递归的算法”。

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

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

举例:
迷宫为:(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.4s]
复制代码


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


另外一种探索解法:
游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-1 21:11:48 | 显示全部楼层
好评,受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-13 19:42:12 | 显示全部楼层
滴滴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-16 15:33:22 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-23 07:41:25 From FishC Mobile | 显示全部楼层
看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-23 13:15:34 From FishC Mobile | 显示全部楼层
本帖最后由 qaz123765 于 2017-6-23 13:29 编辑

用的楼主的回溯法
  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]]


  10. start=(0,0)
  11. mov=[(-1,0),(1,0),(0,-1),(0,1)]
  12. step=[(3,5)]
  13. tr=step.pop()
  14. a=[[0]*6 for i in range(7)]
  15. b={}
  16. m,n=0,0
  17. #print(a)
  18. while tr!=start:
  19.     for i in mov:
  20.         m=tr[0]+i[0]
  21.         n=tr[1]+i[1]
  22.    
  23.         if 0<=m<7 and 0<=n<6 and maze[m][n]!=0 and a[m][n]!=1:
  24.             step.append((m,n))
  25.             b[(m,n)]=tr
  26.             a[m][n]=1
  27.             #print(step)
  28.     tr=step.pop()

  29. else:
  30.     print('start!!')
  31.     maze[0][0]='g'
  32.     t=start
  33.     while t!=(3,5):
  34.         t=b[t]
  35.         maze[t[0]][t[1]]='g'
  36.         
  37. for i in range(7):
  38.     print(maze[i])

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

使用道具 举报

发表于 2017-6-23 13:27:09 From FishC Mobile | 显示全部楼层
探索法手机上看不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 22:16:30 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-15 22:38:13 | 显示全部楼层
23546+
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 16:07:12 | 显示全部楼层
66666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-26 13:15:40 From FishC Mobile | 显示全部楼层
跟着学习一下,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-4 22:48:49 From FishC Mobile | 显示全部楼层
111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-5 14:04:53 | 显示全部楼层
本帖最后由 久疤K 于 2018-7-5 14:07 编辑

字典太大了,费时间,这个解法非常快

  1. import time

  2. def ti(func):
  3.     def call(*v):
  4.         s = time.time()
  5.         r = func(*v)
  6.         t = time.time()
  7.         print(func.__name__,t-s)
  8.         return r
  9.     return call

  10. def _go(lss,now,end,res,ress):
  11.     i,j = now
  12.     if lss[i][j]==0 or now in res:
  13.         return
  14.     res.append(now)
  15.     if now==end:
  16.         ress.append(res)
  17.         return
  18.     tmp = []
  19.     if i > 0:
  20.         _go(lss,(i-1,j),end,res.copy(),ress)
  21.     if i < len(lss)-1:
  22.         _go(lss,(i+1,j),end,res.copy(),ress)
  23.     if j > 0:
  24.         _go(lss,(i,j-1),end,res.copy(),ress)
  25.     if j < len(lss[i])-1:
  26.         _go(lss,(i,j+1),end,res.copy(),ress)

  27. def go(lss,start,end):
  28.     ress = []
  29.     _go(lss,start,end,[],ress)
  30.     return ress

  31. @ti
  32. def fun():
  33.     room = [[1 ,0, 1, 0, 0, 1 ,0, 1, 0, 0, 0],
  34.             [1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
  35.             [0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
  36.             [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1],
  37.             [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
  38.             [0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0],
  39.             [0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
  40.             [1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1],
  41.             [0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
  42.             [1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1],
  43.             [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
  44.             [0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0],
  45.             [0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
  46.             [1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
  47.             [0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
  48.             [1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1],
  49.             [1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1],
  50.             [0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0],
  51.             [0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]]
  52.     start = (0,0)
  53.     end = (len(room)-1,len(room[-1])-1)
  54.     ress = go(room,start,end)
  55.     return ress

  56. def main():
  57.     ress = fun()
  58.     print("total: " ,len(ress))
  59.     print('None' if len(ress)==0 else ress[0])

  60. if __name__ == "__main__":
  61.     main()
复制代码
  1. res:
  2. fun 0.002000093460083008
  3. total:  1
  4. [(0, 0), (1, 0), (1, 1), (1, 2), (2, 2), (3, 2), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 6), (6, 6), (7, 6), (7, 7), (8, 7), (9, 7), (10, 7), (10, 8), (11, 8), (12, 8), (13, 8), (13, 7), (14, 7), (15, 7), (16, 7), (16, 8), (17, 8), (18, 8), (18, 9), (18, 10)]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 11:16:08 | 显示全部楼层
学习了,新手看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-5 09:43:07 | 显示全部楼层
真棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-31 21:06:33 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-16 14:27:06 | 显示全部楼层
支持支持!!!最近作业是这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-16 15:09:19 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 14:41:00 | 显示全部楼层
我试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-7 19:53:41 From FishC Mobile | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 09:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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