1. 程式人生 > >Python “最短”挑戰(12.28)

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')