- 在线时间
- 479 小时
- 最后登录
- 2026-5-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7813 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2931
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1173
- 主题
- 1188
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】3 S) s, X: q7 o- F" S- C" z
+ }" p( O0 T: Y* _6 s% M2 } g
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。
3 a9 y, h: c, y- ^7 P( _7 S! n1 J; E- |" S8 S
【输入格式】
# q' }2 V- h$ ]4 J- x/ K; |$ T$ _ N# w* b9 c$ L
第一行包含两个整数 n 和 m。8 i r) k. q i2 w! l, J8 }6 P8 B) S
/ `" P. C' k! j0 z# H9 t' h
接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。- o$ \# f, A7 I+ }
7 \3 T4 P' H( p. t【输出格式】
# Q0 [- W5 V/ N9 L
' m9 G* C2 X' B! t" ?: K6 `7 a/ H; M" M 输出一个整数,表示从左上角移动至右下角的最少移动次数。
- G3 L/ y! W7 d
6 g4 U6 H" Z( }【数据范围】* \* j! c! f& l4 a# P& B, A
; O+ d: F" c! Y/ ?9 Y 1≤n,m≤1000 f6 `* K; h# d" g5 ?
* M8 F" P+ N' c7 ]$ ~' ^- @; K
【输入样例】0 Q0 ~" y+ K1 a2 H% u/ b
! g+ y& o9 ], I1 e0 q6 p% J& Q5 5
4 {- F: b& Y1 J, b* r3 o( \6 [0 1 0 0 0
7 E }3 Z7 [$ T0 1 0 1 0" Y. B; l0 j2 w1 r3 {
0 0 0 0 0
" [* ~( w- l9 H( i8 _! z m0 1 1 1 0* X& m8 o: b& C, {- M. \7 x
0 0 0 1 0# e |& V i! e* |& h' B" h
【输出样例】
3 q6 G$ ^( a" w& u2 _; b2 P+ B0 j. w3 z2 S
8
1 {9 S- j; T7 g8 | 【解题思路】
/ P# z+ U( V; J: u8 W5 ^" j
' n' ^' I8 ] X/ l& A( a8 h1 I! x$ \ BFS的典中典。- from collections import *) m2 M% J, ?/ B0 @) M/ Y
- n,m = map(int,input().split())
: i- V+ Z6 ]2 W! U! O2 Q9 p - mp = [[0]*(m+5)]
0 O/ T* f) w3 p7 M S p - for i in range(n):( r; G r; o, P4 g( R+ T; v
- mp.append([0]+list(map(int,input().split())))
0 h3 a4 O3 W4 ~$ q! l$ S - dir = [(1,0),(-1,0),(0,1),(0,-1)]
' F$ s/ a5 f6 L a* b3 P - st = [[0]*(m+5) for _ in range(n+5)]
8 L% ~/ p\" l- z - def bfs():8 r3 a7 [/ V9 L2 x9 b- b6 q$ b
- q = deque()
* L. X$ D( ]$ o) T - q.append([1,1,0])! H- w$ D2 ]! s7 P) E\" F
- st[1][1]=1) [0 X: }7 a- S
- while q:
1 m$ G5 H2 | A, w3 M - tx,ty,step = q.popleft()$ | _5 J& n6 w7 N
- if tx==n and ty==m:
/ U3 m$ P m1 u1 O+ p9 v$ [ - print(step)/ z! R$ N3 q6 J8 w) Z0 f9 S
- return
1 D# k! f- Y8 Q) a. i - for x_,y_ in dir:
( R# ] P! ^+ J - nx,ny = tx+x_,ty+y_; @5 I9 X+ G7 k6 E
- if nx<1 or nx>n or ny<1 or ny>m:continue1 N& V8 t/ o, T, O
- if mp[nx][ny]==1 or st[nx][ny]:continue
\" Y2 \\" Q3 t4 N& x( l+ D* \ - q.append( [nx,ny,step+1] )+ E/ ?# G: Q# Q( S9 N7 ] e
- st[nx][ny]=10 f6 g6 ?& h. s' o# ~9 C3 \
- bfs()
复制代码 7 q. _; o3 a# T% Y8 i. `0 n* }/ I
|
zan
|