Python解法华为OJ机试-迷宫问题

华为OJ机试-迷宫问题


机试链接
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132…anking&tab=answerKey
之前学习过python,时间有点久了,平时工作也没怎么接触代码,想把一块重新捡起来,就找题目做做,发现真的很多都不会,于是找了很多解法方案,但是python的解法还是这个老哥的nice:
附上原先的:
本文链接:https://blog.csdn.net/weixin_26850469/article/details/112446815
连接 链接: link.
下面展示 代码。简单明了!

# 利用动态规划和递归解
def jud(x, y, l, ll, lll):  # 求x,y点坐标在迷宫里的可能走法,即向上,向下,向左,向右
    n, m = len(l) - 1, len(l[0]) - 1  # l为迷宫位置二维图,ll为迷宫的每点从起点到该点
    k = []  # 的最短路径,lll为记录正在探索的从起点到该点的路线用以避免走重复
    if x + 1 <= n and (x + 1,y) not in lll and l[x + 1][y] != 1:#向右边走,不会超过边界,且不再已经走过的路线中,且不是墙体
        k += [(x + 1,y)]#将这个点位,记录到路径里面
    if x - 1 >= 0 and (x - 1,y) not in lll and l[x - 1][y] != 1:#向左走,不会超过边界,且不再已经走过的路线中,且不是墙体
        k += [(x - 1,y)]
    if y + 1 <= m and (x,y + 1) not in lll and l[x][y + 1] != 1:#向下走,不会超过边界,且不再已经走过的路线中,且不是墙体
        k += [(x,y + 1)]
    if y - 1 >= 0 and (x,y - 1) not in lll and l[x][y - 1] != 1:#向上走,不会超过边界,且不再已经走过的路线中,且不是墙体
        k += [(x,y - 1)]
    return k

def mg(x, y, l, ll, lll):  # x,y为该点坐标,其余同上,探索x,y的走法
    k = jud(x, y, l, ll, lll)  # k为可能的走法
    lll += [(x,y)]  # lll位置储存
    if len(k) > 0:  # 是否为可走
        for v in k:
            x1,y1 = v
            if not ll[x1][y1]:  # 如果x1,y1位置 还没有路径信息,用x,y位置进
                ll[x1][y1] = ll[x][y] + [(x1,y1)]  # 行更新
            if len(ll[x1][y1]) >= len(ll[x][y]) + 1:  # 如果x1,y1之前储存的路径#要长于从x,y的路径到x1,y1的,则更新x1,y1路径信息
                ll[x1][y1] = ll[x][y] + [(x1,y1)]
            mg(x1, y1, l, ll, lll)  # 再对x1,y1 这点进行探索
    return False
while True:
    try:
        lists = input('')#获取输入的行数与列数
        n = int(lists.split(" ")[0])
        m = int(lists.split(" ")[1])
        l, ll, lll = [], [], []
        for i in range(n):
            l += [list(map(int, input().split()))]
        for i in range(n):
            ll.append([])
            for j in range(m):
                ll[i].append([])
        ll[0][0] = [(0,0)]
        mg(0, 0, l, ll, lll)  # 设置起始点为(00),你也可以设为其他点为起始,
        for v in ll[-1][-1]:  # 来探索其他点到任意一点的最短位置
            print("(%d,%d)" % (v[0], v[1]))  # ll[-1][-1], 指的是将右下角一点设,元组输出前面有空格,需要将格式转换为题目要求的格式
    except:
        break

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值