python迷宫问题,递归思想

题目:一只老鼠在一个nxn迷宫的入口,他想要吃掉迷宫出口处放着的奶酪,问这只老鼠能否吃到奶酪?如果可以吃到,请给出一条从入口到奶酪的路径。
思考:解决问题之前,我们需要找出已知条件和要得到什么,,和解数学问题和物理问题一样,先读懂题,这道题可以用数学模型充型定义。
数学模型:
这个问题:问老鼠能否吃到奶酪就是能否找到一条从迷宫入口到出口的路径,如果不能找到,老鼠就吃不到奶酪;如果能找到,那么就给出这条路径。
观察10x10的迷宫。这个迷宫就是由10x10=100个格子组成的,其中绿色格子代表墙,白色格子代表路,我们将这局话改为数学形式,用1表示墙,0表路,就可以得到一个新的二位数组,即:
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[0] [3]到m[7] [9]全部为0的路径。
我们用递归解决该问题:
python代码如下

def maze (m,n,route,pos,export):
    '''

    :param m: 迷宫数组,列表
    :param n: 迷宫阶数
    :param route: 可能的路线,列表
    :param pos: 当前位置,元组
    :param 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))


代码算法比较复杂,建议反复理解!
感谢观看!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Python 中 DFS 递归实现迷宫问题的代码示例: ```python # 定义迷宫地图,0 表示可走,1 表示障碍物 maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0], ] # 定义迷宫大小 n = len(maze) m = len(maze[0]) # 定义标记数组,标记每个位置是否已经访问过 visited = [[False] * m for _ in range(n)] # 定义终点位置 end = (4, 3) # 定义方向数组,表示上下左右四个方向 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] def dfs(x, y): # 如果当前位置就是终点位置,则直接返回 True if (x, y) == end: return True # 标记当前位置已经访问过 visited[x][y] = True # 枚举四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断是否越界,是否已经访问过,是否是障碍物 if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and maze[nx][ny] == 0: # 递归搜索下一个位置 if dfs(nx, ny): return True # 如果四个方向都没找到终点,则返回 False return False # 在起点位置开始搜索 start = (0, 0) if dfs(start[0], start[1]): print("可以到达终点!") else: print("无法到达终点!") ``` 这段代码中,我们先定义了一个迷宫地图 `maze`,然后定义了迷宫的大小 `n` 和 `m`,以及标记数组 `visited` 和终点位置 `end`。 接着,我们定义了一个 DFS 函数 `dfs`,它的参数是当前位置的坐标 `(x, y)`,表示从这个位置开始搜索。 在 `dfs` 函数中,我们首先判断当前位置是否是终点位置,如果是,则直接返回 True。 然后,我们标记当前位置已经访问过,并枚举当前位置可以走的四个方向。对于每个方向,我们判断是否可以走,如果可以,则递归搜索下一个位置。如果在四个方向中找到了终点位置,则返回 True。 最后,在主函数中,我们从起点位置开始搜索,如果可以到达终点,则输出“可以到达终点!”;否则输出“无法到达终点!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值