現有一形如下圖的n*m
大小的迷宮:
sx...
.x.x.
.x.x.
...xd
's'
表示出發點,'d'
表示目的地,'x'
表示牆,'.'
表示路。請你判斷,是否可以用小於等於t
的步數走出迷宮。
有多行輸入,第一行三個用空格隔開的數n,m,t
,下面n
行,每行有m
個字元,表示迷宮,0 0 0
表示輸入的終止。
如果可以,輸出'yes'
,否則輸出'no'
。
其餘要求同首題。
4 5 12
sx...
.x.x.
.x.x.
...xd
4 5 13
sx...
.x.x.
.x.x.
...xd
0 0 0
no
yes
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<=x0<=y[y]and maze[x]
[y]!=
'x':
v[x]
[y]=
0[x,y]
) t[x]
[y]=t[p[0]
][p[1]
]+1return t+
1while
true
: n,m,t=
(map
(int
,input()
.split())
)if n==0:
break
v=[[
1for i in
range
(m)]
for j in
range
(n)]
t=[[
0for 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):
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
ifabs(si-di)
+abs
(sj-dj)
>t:
flag=
false
else
: flag=
(bfs(
)<=t)
if flag:
print
('yes'
)else
:print
('no'
)
Python 「最短」挑戰(12 18)
有1元 5元 10元 50元 100元 500元的硬幣各若干枚,用乙個六元陣列c表示。現在要用這些硬幣來支付k元,最少需要多少枚硬幣?兩行,第一行六個數,空格隔開,表示硬幣的數量 第二行乙個數k,表示目標值。最少需要的硬幣枚數,如果無法湊成,輸出0。其餘要求同首題。v,c,k 1 5,10 50,1...
Python 「最短」挑戰(12 19)
有乙個長為n的數列a。請求出這個序列中最長的上公升序列的長度。上公升序列指的是對於任意的i,j都滿足a i 兩行,第一行乙個數n,表示數列長度 第二行n個數,空格隔開,表示數列裡的數。最長上公升序列長度。其餘要求同首題。n,a int input list map int input split p...
Python 「最短」挑戰(12 20)
有n項工作,每項工作分別在s i 時間開始,在t i 時間結束。對於每項工作,你都可以選擇參與與否。如果選擇了參與,那麼自始至終都必須全程參與。此外,參與工作的時間段不能重疊 即使是開始的瞬間和結束的瞬間的重疊也是不允許的 求最多能參與多少項工作。比如,當n 5,s 1,2,4,6,8 t 3,5,...