题解 | #迷宫问题#

迷宫问题

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)

全部评论

相关推荐

点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
04-11 00:51
已编辑
门头沟学院 Java
先说一下楼主的情况:双非本大三,两段实习,javaer,想要找一个暑期大厂offer,努力了两个月,三月份每天的状态就是算法,八股,项目,四月份更是一个面试没有,最终还是没有结果,心碎了一地。期间面了一些中小厂,大厂只有腾讯约面,其他大厂都投了一遍,但是还是石沉大海。再看一下楼主的面试结果吧,就不说ttl了腾讯s3:三面挂csig:一面挂teg:三面挂wxg:一面挂没错,面了八次腾讯,两次三面挂,当时真的心都碎了。其他中小厂都有面,有的没过,有的oc,但是都没有去。其他大厂投了简历,但是不是简历挂,就是测评挂,都说今年行情好很多,各大厂都扩招,可是问题出在那里呢?学历背景吗?实习经历吗?还是简历不够好看?依稀记得,从年初七就离开了家里,回到学校,早早准备面试,当时自己认为凭借着自己的两段实习经历,以及大二就开始准备的八股算法,拿大厂offer不是问题,但是还是不敢放松,回校的状态每天就是算法,八股,还有查看各种招聘信息,想着尽早投机会多,但是事实证明,投的早,不如投的刚刚好。当时想着,先投一些中小厂开始面试,找找面试感觉,从2.10就开始有面试了,基本都是线下面试,面试的感觉都很不错,觉得自己的状态慢慢回来了,期间也有oc一些中小厂,但是自己的目标并不在此,只是想练一下手,遂拒。后面投了腾讯的暑期实习基地,不久就约面了,第一次面这么大的厂,多少有点紧张,好在运气还不错,遇到的面试官也比较好,一直干到了三面,期间看牛客有不少说一面就挂了的,感觉自己还是比较幸运的,但是没想到倒在了三面,一周后就挂了,伤心是有的,但是想到这才刚刚开始,还有很多机会,便继续准备下一次面试了,很快,被另外一个部门捞了,一进会议,面试官没开摄像头,看网上说没开摄像头很多都是kpi,但是自己给自己打气,认为面试官只是不方便开摄像头罢了,面完,感觉良好,没问什么很难得问题,基本都答出来了,算法两道也a了一道,感觉实习不会这么严格吧?还是过了一会挂了,因为这个?还是技术不太匹配?面试过程中说搞C++的,心想,搞c++的你面我干啥?唉,这时候有点气馁,然后就接下来半个月没有面试。这时已经是三月底了,看到牛客好多人都已经陆陆续续拿到了offer,看人家的面试准备也没那么早,有0实习的,有没刷算法的,有两个面的,,,唉,反正是一言难尽啊,感觉努力没有什么意义,面试多半是看面试官的感觉,主观性很大啊,只要你技术没有太大的问题。第三次面试腾讯,面试来的比较突然,期间已经有几天没看八股什么的了,临时看了一下之前自己做的面试笔记,但是面试却异常顺利,三天闯到了三面,自己也不敢相信,三面玩感觉也良好,脑子里不得不想着一些“offer结算画面”,但是过了一会查看流程显示“流程终止”,我?哎,当时真的有苦说不出啊,也是一晚没睡。后面就逐渐开始褪去大厂梦了,看着曾经跟自己交流的牛油,朋友,认识的人,觉得他们技术不太如你,算法刷的没你多,进了大厂,但是这又如何呢?能力强不强不是你了说了,面试官说了算。也逐渐知道,不是你能力好就可以了,还得有运气,运气,运气。这个过程太累了,和自己和解吧,不用非得大厂,找个合适一点的就好,放轻松一点。今天有点心事睡不着,闲着想写一些自己的面试过程,勿喷。附上一张面试的情况,公司就不方便透露了。
怒卷的斯科特:八分运气两分实力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务