Python 「最短」挑戰(12 28)

2021-09-05 12:27:27 字數 2016 閱讀 1146

現有一形如下圖的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,...