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')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值