Python “最短”挑戰(12.28)
阿新 • • 發佈:2018-12-30
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')