Python “最短”挑战(12.28)

Description

现有一形如下图的N*M大小的迷宫:

SX...
.X.X.
.X.X.
...XD

'S'表示出发点,'D'表示目的地,'X'表示墙,'.'表示路。请你判断,是否可以用小于等于T的步数走出迷宫。

Input

有多行输入,第一行三个用空格隔开的数N,M,T,下面N行,每行有M个字符,表示迷宫,0 0 0表示输入的终止。

Output

如果可以,输出'YES',否则输出'NO'
其余要求同首题

Sample Input

4 5 12
SX...
.X.X.
.X.X.
...XD
4 5 13
SX...
.X.X.
.X.X.
...XD
0 0 0

Sample Output

NO
YES

Reference code

def bfs():
    que=[[si,sj]]
    while len(que):
        p=que[0]
        que.pop(0)
        if p==[di,dj]:
            return t[p[0]][p[1]]
        for i in range(4):
            [x,y]=[p[0]+dx[i],p[1]+dy[i]]
            if 0<=x<N and 0<=y<M and v[x][y] and maze[x][y]!='X':
                v[x][y]=0
                que.append([x,y])
                t[x][y]=t[p[0]][p[1]]+1
    return T+1
while True:
    N,M,T=(map(int,input().split()))
    if N==0:
        break
    v=[[1 for i in range(M)] for j in range(N)]
    t=[[0 for i in range(M)] for j in range(N)]
    dx=[-1,0,1,0]
    dy=[0,-1,0,1]
    maze=[]
    for i in range(N):
        maze.append(input())
    for i in range(N):
        for j in range(M):
            if maze[i][j]=='S':
                si,sj=i,j
            if maze[i][j]=='D':
                di,dj=i,j
    if abs(si-di)+abs(sj-dj)>T:
        flag=False
    else:
        flag=(bfs()<=T)
    if flag:
        print('YES')
    else:
        print('NO')

猜你喜欢

转载自blog.csdn.net/qq_43549984/article/details/85330380