博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 回溯法 子集树模板 系列 —— 2、迷宫问题
阅读量:6446 次
发布时间:2019-06-23

本文共 1769 字,大约阅读时间需要 5 分钟。

问题

给定一个迷宫,入口已知。问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。为方便起见,用1将迷宫围起来避免边界问题。

分析

考虑到左、右是相对的,因此修改为:北、东北、东、东南、南、西南、西、西北八个方向。在任意一格内,有8个方向可以选择,亦即8种状态可选。因此从入口格子开始,每进入一格都要遍历这8种状态。

显然,可以套用回溯法的子集树模板。

注意,解的长度是不固定的。

img_7a56fb9191a6546af20a9d96c4bb8cb7.png

图片来源:

代码

# 迷宫(1是墙,0是通路)maze = [[1,1,1,1,1,1,1,1,1,1],        [0,0,1,0,1,1,1,1,0,1],        [1,1,0,1,0,1,1,0,1,1],        [1,0,1,1,1,0,0,1,1,1],        [1,1,1,0,0,1,1,0,1,1],        [1,1,0,1,1,1,1,1,0,1],        [1,0,1,0,0,1,1,1,1,0],        [1,1,1,1,1,0,1,1,1,1]]m, n = 8, 10   # 8行,10列entry = (1,0)  # 迷宫入口path = [entry] # 一个解(路径)paths = []     # 一组解# 移动的方向(顺时针8个:N, EN, E, ES, S, WS, W, WN)directions = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]# 冲突检测def conflict(nx, ny):    global m,n,maze        # 是否在迷宫中,以及是否可通行    if 0 <= nx < m and 0 <= ny < n and maze[nx][ny]==0:        return False        return True# 套用子集树模板def walk(x, y): # 到达(x,y)格子    global entry,m,n,maze,path,paths,directions        if (x,y) != entry and (x % (m-1) ==0 or y % (n-1) == 0):  # 出口        #print(path)        paths.append(path[:]) # 直接保存,未做最优化    else:        for d in directions: # 遍历8个方向(亦即8个状态)            nx, ny = x+d[0], y+d[1]            path.append((nx,ny))     # 保存,新坐标入栈            if not conflict(nx, ny): # 剪枝                maze[nx][ny] = 2         # 标记,已访问(奇怪,此两句只能放在if区块内!)                walk(nx, ny)                maze[nx][ny] = 0         # 回溯,恢复            path.pop()               # 回溯,出栈# 解的可视化(根据一个解x,复原迷宫路径,'2'表示通路)def show(path):    global maze        import pprint, copy        maze2 = copy.deepcopy(maze)        for p in path:        maze2[p[0]][p[1]] = 2 # 通路            pprint.pprint(maze)  # 原迷宫    print()    pprint.pprint(maze2) # 带通路的迷宫# 测试walk(1,0)print(paths[-1], '\n') # 看看最后一条路径show(paths[-1])

效果图

img_adedd6e542ffa4874465a2707e0bd054.jpg

转载地址:http://pmvwo.baihongyu.com/

你可能感兴趣的文章
YbSoftwareFactory 代码生成插件【十一】:ASP.NET WebApi MVC下组织机构管理和菜单权限管理的实现...
查看>>
变量输出在window xp下使用eventquery.vbs脚本输出当天电脑每次的启动时间
查看>>
[摘录]高效人士七习惯—重新探索自我
查看>>
CheckBoxList控件选中的选项不能改变
查看>>
编程回调面向对象设计开卷考题A
查看>>
posix多线程有感--线程高级编程(线程和fork,exec)
查看>>
如何通过超链接打开Activity并传入参数
查看>>
在Sql2005中,向表中插入数据时遇到uniqueidentifier列,如何插入数据?
查看>>
nullnullIOS里多态的一些方法
查看>>
PostgreSQL在何处处理 sql查询之三十六
查看>>
创建FileShare的content source的SharePoint 2013的powershell脚本
查看>>
【iOS开发者必备】APP 图标规格参考表
查看>>
泛型中去掉指定字段重复的数据
查看>>
postgreSql 常用查询总结
查看>>
ReactiveCocoa
查看>>
WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
查看>>
微信小程序 - 如何通过button按钮实现分享(转发)功能
查看>>
方法总比困难多
查看>>
android使用inject需要注意的地方
查看>>
艾伟也谈项目管理,五大绝招 消除项目小组与用户的矛盾
查看>>