“在迷宫中寻找最短路径”|在谷歌intervi中问道

2024-04-24 09:29:38 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:写一个函数答案(地图),它生成从监狱门到逃生舱的最短路径长度,在那里你可以移除一堵墙作为你的改造计划的一部分。在

路径长度是通过的节点总数,同时计算入口和出口节点。起始和结束位置始终可以通过(0)。在

地图始终是可解的,尽管您可能需要也可能不需要移除墙。地图的高度和宽度可以是2到20。只能按基本方向移动;不允许对角移动。在

输入:

(int) maze = [[0, 1, 1, 0], [0, 0, 0, 1], [1, 1, 0, 0], [1, 1, 1, 0]]

输出:

^{pr2}$

输入:

(int) maze = [[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0]]

输出:

(int) 11

我写了一个程序,它在本地运行,但不知怎么的,当我把它提交到网上验证时,它就不起作用了

它只通过了5个中的第一个测试

我知道前两个测试输入,我单独测试了它们,它在本地工作

import sys
counter = 1
lol = []
def lolit(k):
    global lol
    lol.append(k)

def isSafe(mat, visited, i, j):
    try:
        if(mat[i][j] == 1 or visited[i][j]):
            return False
        else:
            return True
    except:
        return False

def isValid(i,j,M):
    if (i < M and j < M and i >= 0 and j >= 0):
        return True
    else:
        return False


def findShortestPath(mat,visited,i,j,k):
    global counter
    M = len(visited)
    if(i == M-1 and j == M-1):

        lolit(k)        
        counter = k


    else:          
        visited[i][j] = 1 


        '''go to bottom'''
        if(isValid(i + 1, j,M) and isSafe(mat, visited, i + 1, j)):

            findShortestPath(mat, visited, i + 1, j,k+1)


        if (isValid(i, j + 1,M) and isSafe(mat, visited, i, j + 1)):

            findShortestPath(mat, visited, i, j + 1,k+1)



        if (isValid(i - 1, j,M) and isSafe(mat, visited, i - 1, j)):

            findShortestPath(mat, visited, i - 1, j,k+1)


        if (isValid(i, j - 1,M) and isSafe(mat, visited, i, j - 1)):

            findShortestPath(mat, visited, i, j - 1,k+1)

    return counter




def answer(mat):
    global lol
    L = len(mat)
    visited = [[0 for x in range(L)] for y in range(L)]

    nr = []
    findShortestPath(mat,visited,0,0,1)

    for indexi,nakul in enumerate(mat):
        for indexj,rathore in enumerate(nakul):
            if(rathore == 1):
                nr.append([indexi,indexj])
    for indexm,nrm in enumerate(nr):
        mat[nrm[0]][nrm[1]] = 0
        visited = [[0 for x in range(L)] for y in range(L)]
        findShortestPath(mat,visited,0,0,1)
        mat[nrm[0]][nrm[1]] = 1
    ping = min(lol)
    lol =[]
    return ping

print answer([[0, 1, 1, 0], [0, 0, 0, 1], [1, 1, 0, 0], [1, 1, 1, 0]])   

print answer([[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0]])

Tags: andinforreturnifdefcounterrange