计算机科学6.14脆弱的迷宫
这一关终于可以用递归解决问题了,
什么你不太懂递归,那可以先试试循环。
下面是我先讲讲用循环的思路:
hero想要到达出口,可以去循环“右-上-左”这样的一个组合命令
或者去循环“上-右-左”这样的组合
什么意思呢?
能不能换其他组合?
1、为什么是“右-上-左”/“上-右-左”策略
首先我们的目标在右上方
思考1:如果这些道路上没有障碍,我们怎样能最快到达右上角?
- 要么“一路向右,到达最右边不能再继续后,在向上走”
- 要么“一路向上,到达最上边不能再继续后,在向右走”
但这里,走到某个节点可能会有一些障碍,怎么办呢?
策略1:"右-上"走不通,可以向左走去探探路
2、hero总要走回头路怎么办?
问题1:在(2,5)处,如果再次重复“右上左",那么hero就一直在 (2.5)-(2,6)中间迂回,陷入超时无法完成的状态
思考2:从(2.6)到(2,5)此时如何跳过“向右走”,避免走回头路?
策略2:是否我们可以为走过的点做一个标记
每次走向下一个目标之前,去判断一下它是不是无标记的
- 如果无标记,那么说明没走过,可以继续
- 如果有标记,说明已经走过,跳过这个方向
思考3:这个思路用编程如何实现?
策略3:我们可以把这对应的“标记”放在二维数组对应的位置存储
好,接下来构建二维数组record[][]
还记得在上一关卡中,二维数组的构建方法吗?
6.13脆弱的迷宫跳转链接
这一关路线那么整齐,比黄金选择中的行列清晰多了
如果还没有很好掌握python构造二维数组的方法,大家可以回去看我的上一篇帖子!
左下角的起点设为record[0][0]
record = [[0] *7 for i in range (7)]
那么他的[row][col]怎么设置呢?
强调:一定要用int()
col=int(hero.pos.x-18)/distanceBetweenRooms
row=int(hero.pos.y-19)/distanceBetweenRooms
这下,循环转起来吧!
while True:
while hero.isPathClear(hero.pos, {
"x": hero.pos.x+ distanceBetweenRooms , "y": hero.pos.y}) and hero