题解 | #迷宫问题#

迷宫问题

https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

# 一种巨踏马麻烦的办法,写到这里其实可以开始优化了,但是懒得搞了
# 核心想法就是把所有的点先拿出来,然后顺着点走,能走通的最长的路即为解(忘了题目说的只有唯一解,后面有部分处理可以省略)。
# 能走通的路即为解,走不通的路需要舍弃。舍弃的方法就是判断后面的路,只取最长的一条,其余为断路。
# 其次在走路的时候要考虑向右向下、向上和向左的走法,这些走法的前提是前一个走过的点不能和下一步有可能的点一样,否则就是走回头路,会导致无限循环
# 每一种走法需要排除掉其他走法的影响,但是也要考虑其他走法的可能性。其中向上走之后不能再向下走,向左走之后不能再向右走,反之亦然。
# 刚开始思路很容易有,但是处理起来特别麻烦,也想不出其他什么比较精妙的办法,只能死磕,想用数组接收返回值然后往上加,发现行不通,因为输出结果不是tree,多种可能性没想好怎么处理,现在看其实也是可行的
# 最后写了三个mutual recursion的函数,耍了一点小聪明,舍弃了数组直接把结果加起来,然后再分开。可谓无所不用其极,过于复杂了。接下来看看大神的题解开开眼界~
m, n = list(map(int, input().split(' ')))


maze = []

for i in range(m):
    inner = list(map(int, input().split(' ')))
    maze.append(inner)

positions = []

for i in range(len(maze)):
    for j in range(len(maze[i])):
        if maze[i][j] == 0:
            positions.append([i, j])

# print(positions)
def find_path_up(pre_position, position, positions):
    pr = pre_position
    p = position
    p2 = [i for i in positions if (i[1] == p[1] + 1 and i [0] == p[0])]
    p3 = [i for i in positions if (i[0] == p[0] - 1 and i[1] == p[1])]
    p4 = [i for i in positions if (i[1] == p[1] - 1 and i[0] == p[0])]
    # print(pr, p, p2, p3, p4)
    if p == positions[-1]:
        return p
    if p2 and [i for i in p2 if i != pr]:
        p = [p+(find_path(p, i, positions)) for i in p2]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
        # print(p)
    elif p3 and [i for i in p3 if i != pr]:
        p = [p+(find_path_up(p, i, positions)) for i in p3]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
        # for i in p3:
            # positions = [p for p in positions if p[0] >= i[0] and p[1] >= i[1]]
            # p += (find_path_up(i, positions))
    elif p4 and [i for i in p4 if i != pr]:
        p = [p+(find_path_down(p, i, positions)) for i in p4]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
    elif not p2 and not p3:
        pass
    # print(p)
    return p

def find_path_down(pre_position, position, positions):
    pr = pre_position
    p = position
    p2 = [i for i in positions if (i[0] == p[0] + 1 and i[1] == p[1])]
    p3 = [i for i in positions if (i[0] == p[0] - 1 and i[1] == p[1])]
    p4 = [i for i in positions if (i[1] == p[1] - 1 and i[0] == p[0])]
    # print(pr, p, p2, p3, p4)
    if p == positions[-1]:
        return p
    if p2 and [i for i in p2 if i != pr]:
        p = [p+(find_path(p, i, positions)) for i in p2]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
        # print(p)
    elif p3 and [i for i in p3 if i != pr]:
        p = [p+(find_path_up(p, i, positions)) for i in p3]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
        # for i in p3:
            # positions = [p for p in positions if p[0] >= i[0] and p[1] >= i[1]]
            # p += (find_path_up(i, positions))
    elif p4 and [i for i in p4 if i != pr]:
        p = [p+(find_path_down(p, i, positions)) for i in p4]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
    elif not p2 and not p3:
        pass
    # print(p)
    return p

def find_path(pre_position, position, positions):
    pr = pre_position
    p = position
    p2 = [i for i in positions if (i[0] == p[0] + 1 and i[1] == p[1])\
                               or (i[1] == p[1] + 1 and i [0] == p[0])]
    p3 = [i for i in positions if (i[0] == p[0] - 1 and i[1] == p[1])]
    p4 = [i for i in positions if (i[1] == p[1] - 1 and i[0] == p[0])]
    # print(pr, p, p2, p3, p4)
    if p == positions[-1]:
        return p
    if p2 and [i for i in p2 if i != pr]:
        p = [p+(find_path(p, i, positions)) for i in p2]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
        # print(p)
    elif p3 and [i for i in p3 if i != pr]:
        p = [p+(find_path_up(p, i, positions)) for i in p3]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
        # for i in p3:
            # positions = [p for p in positions if p[0] >= i[0] and p[1] >= i[1]]
            # p += (find_path_up(i, positions))
    elif p4 and [i for i in p4 if i != pr]:
        p = [p+(find_path_down(p, i, positions)) for i in p4]
        p = sorted(p, key=lambda x : len(x))
        p = p[-1]
    elif not p2 and not p3 and not p4:
        pass
    # print(p)
    return p

# try:
res = find_path([], [0, 0], positions)
# print(res)
result = []
for i in range(0, len(res), 2):
    result.append(res[i:i+2])

# print(result)

points = []
for i in range(len(result)):
    if result[i] == [0, 0] or result[i] == positions[-1]:
        points.append(i)

# print(points)

result2 = [result[points[i]:points[i+1]+1] for i in range(len(points)-1)]

# print(result2)
x = sorted([[i, len(result2[i])] for i in range(len(result2))], key=lambda x : x[1])
# print(x)
x = x[-1][0]
result3 = [tuple(i) for i in result2[x]]

# print(result3)

for i in result3:
    print(f'({i[0]},{i[1]})')
# except Exception as error:
#     print(error)

全部评论

相关推荐

头像
11-10 15:56
东北大学 Java
帆软的感谢信真是又臭又长
等待offer降临的ylq:而且他内部是真的好,实习无转正有感而发
投递帆软软件等公司10个岗位 > 你都收到了哪些公司的感谢信?
点赞 评论 收藏
分享
温特w:恭喜
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务