python——迷宫问题,需要用到递归

项目场景:

一只老鼠在一个n×n迷宫的入口处,它想要吃迷宫出口处放着奶酪,问这只老鼠能否吃到奶酪?如果可以吃到,请给出一条从入口到奶酪的路径。
思考:解决问题之前,我们首先要做的就是仔细研究问题,找出问题的已知条件和要得到的是什么。和解数学问题、物理问题一样要先弄懂问题。那么,老鼠走迷宫问题的已知条件有什么呢?


问题描述

问老鼠能否吃到奶酪就是问能否找到一条从迷宫入口到出口的路径。如果不能找到,那么老鼠就吃不到奶酪;如果能够找到,那么就给出这条路径。

观察10×10的迷宫。这个迷宫其实是由10×10=100个格子组成的,其中绿色格子代表墙,白色格子代表路,如图(1)所示。“绿色格子代表墙,白色格子代表路”是用语言形式描述的,需要转换成数学的形式。用1和0分别定义绿色格子和白色格子,可以得到如图(2)的迷宫。


示例分析:

 m[10][10]=[1,1,1,0,1,1,1,1,1,1,
             1,0,0,0,0,0,0,0,1,1,
             1,0,1,1,1,1,1,0,0,1,
             1,0,1,0,0,0,0,1,0,1,
             1,0,1,0,1,1,0,0,0,1,
             1,0,0,1,1,0,1,0,1,1,
             1,1,1,1,0,0,0,0,1,1,
             1,0,0,0,0,1,1,1,0,0,
             1,0,1,1,0,0,0,0,0,1,
             1,1,1,1,1,1,1,1,1,1]
有了对迷宫的数学定义,就可以很简单的定义迷宫的入口和出口了。迷宫的入口是m[0][3],出口是m[7][9]。老鼠走迷宫问题就是要找一条从入口到出口的路径,如果存在就返回这条路径;如果不存在,就返回不存在这种路径。也就是说,要在二维数组m中找一条从m[0][3]到m[7][9]全部为0的路径。
请使用递归解决迷宫路径查找问题。
 


解决代码:

def maze(m,n,route,pos,export):
    route.append(pos)
    if pos == export :
        print(route)
    if pos[0] > 0 and m[pos[0]-1][pos[1]] == 0 and (pos[0]-1,pos[1]) not in route:
        maze(m,n,route[:],(pos[0]-1,pos[1]),export)
    if pos[0] < n-1 and m[pos[0]+1][pos[1]] == 0 and (pos[0]+1,pos[1]) not in route:
        maze(m,n,route[:],(pos[0]+1,pos[1]),export)
    if pos[1] > 0 and m[pos[0]][pos[1]-1] == 0 and (pos[0],pos[1]-1) not in route:
        maze(m,n,route[:],(pos[0],pos[1]-1),export)
    if pos[1] < n-1 and m[pos[0]][pos[1]+1] == 0 and (pos[0],pos[1]+1) not in route:
        maze(m,n,route[:],(pos[0],pos[1]+1),export)\
        
m=[
   [1,1,1,0,1,1,1,1,1,1],
   [1,0,0,0,0,0,0,0,1,1],
   [1,0,1,1,1,1,1,0,0,1],
   [1,0,1,0,0,0,0,1,0,1],
   [1,0,1,0,1,1,0,0,0,1],
   [1,0,0,1,1,0,1,0,1,1],
   [1,1,1,1,0,0,0,0,1,1],
   [1,0,0,0,0,1,1,1,0,0],
   [1,0,1,1,0,0,0,0,0,1],
   [1,1,1,1,1,1,1,1,1,1]
   ]
maze(m,len(m),list(),(0,3),(7,9))

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python递归迷宫是一种使用递归算法解决迷宫问题的方法。它通过递归地探索迷宫的路径,直到找到出口或者确定没有可行路径为止。以下Python递归迷宫的基本思路: 1. 定义一个函数,例如`solve_maze(maze, start, end)`,其中`maze`表示迷宫的二维数组,`start`表示起始位置,`end`表示目标位置。 2. 在函数内部,首先判断当前位置是否为出口,如果是,则返回True表示找到了一条可行路径。 3. 如果当前位置不是出口,则判断当前位置是否为墙壁或者已经访问过的位置,如果是,则返回False表示此路径不可行。 4. 如果当前位置既不是出口也不是墙壁或者已访问过的位置,则将当前位置标记为已访问,并依次尝试向上、向下、向左、向右四个方向递归调用`solve_maze`函数。 5. 如果四个方向都返回False,则表示此路径不可行,将当前位置重新标记为未访问,并返回False。 6. 如果任意一个方向返回True,则表示找到了一条可行路径,将当前位置添加到路径中,并返回True。 下面是一个简单的示例代码: ```python def solve_maze(maze, start, end): if start == end: return True if maze[start][start] == 1 or maze[start][start] == -1: return False maze[start][start] = -1 if solve_maze(maze, (start-1, start), end): return True if solve_maze(maze, (start+1, start), end): return True if solve_maze(maze, (start, start-1), end): return True if solve_maze(maze, (start, start+1), end): return True maze[start[0]][start] = 0 return False ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值