- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
/ y# F3 m9 t7 u N7 W+ l. W# P- u6 [0 V1 e
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。
* H! D: ^; Y) n k8 `: R5 O5 ^* V8 `- `
【输入格式】8 j. N" h Q& i2 ~! C: r$ o
0 L* O* t+ b4 ^2 ` [% F 第一行包含两个整数 n 和 m。# o6 |, c/ v( A& W- U- t: A
) U: P5 l! u, O: I 接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。, y4 K8 p) B* ]& h6 g
]% V9 X: a7 r; i9 p- E4 z
【输出格式】
0 ]5 i7 |5 P5 C1 X7 N, v1 h3 I) N* P/ J3 z4 n2 C* b+ W T
输出一个整数,表示从左上角移动至右下角的最少移动次数。
3 w" L R: U, p+ d0 q" t3 |6 i
- M5 t: J6 b: U1 ]- d【数据范围】
5 L/ m4 g; q5 f- ~1 Q, g# g8 I3 @1 u
! T3 j d" n# A* E U/ `! a 1≤n,m≤100! [: d+ B' v8 A0 `5 d0 ?
" p$ S7 C) d) `6 k1 y, V
【输入样例】) T; e3 y- P; B5 g3 P
3 ]/ g" \# ~" S5 5
4 N( k% k" X; ]! s0 1 0 0 07 d" s2 P8 A6 ]) N7 U, j
0 1 0 1 0
) A$ V* z7 \: w0 0 0 0 03 \! e$ B- M$ D
0 1 1 1 03 e1 t e0 F( ^' n
0 0 0 1 0
/ R* P4 [0 g8 v2 F0 L* `9 T【输出样例】3 ?/ s) N1 g6 u. \" X: R+ o
7 w5 ?- D- ?3 |: H6 l) g- d
8$ J3 N0 k1 H9 i: Z
【解题思路】
" @. L5 E" i1 a* Y% L7 { c- f! @( O$ d1 _8 o5 C! p/ M' n$ o
BFS的典中典。- from collections import *
( f' D: w\" g6 S% y5 s7 _& E9 v# D - n,m = map(int,input().split())1 U9 p# Y* P- y\" N1 {
- mp = [[0]*(m+5)]: q9 m; ]+ R# q- `3 K! P
- for i in range(n):
- b\" v5 p% B! G - mp.append([0]+list(map(int,input().split())))
2 d6 |( q7 o2 M& d' z- U3 U' m2 X\" }/ `6 t - dir = [(1,0),(-1,0),(0,1),(0,-1)]2 E9 _4 _6 m; C( ]0 P) } [
- st = [[0]*(m+5) for _ in range(n+5)]
; H( K3 E- b; S - def bfs():
( _% l' r( q- B. f/ d - q = deque()
& X3 a8 R- Z# N3 m, g! V/ X0 j( I - q.append([1,1,0])+ Z# K, W T, _$ H% [+ Q, o
- st[1][1]=1. x0 h T4 S\" T0 }! @3 r O
- while q:
6 c8 x* N- `; \1 K/ q - tx,ty,step = q.popleft()
1 R' K4 S1 C) D\" A - if tx==n and ty==m:$ y% v4 {( T4 ~, g( W J4 q
- print(step)1 {\" u8 v! {\" A/ |
- return2 C# o$ Q/ q( z: v\" s% Q0 m
- for x_,y_ in dir:$ }+ u! d' ~9 m- j1 p) m
- nx,ny = tx+x_,ty+y_
- [2 t3 a\" \\" S1 e- {0 p1 u - if nx<1 or nx>n or ny<1 or ny>m:continue
, D1 D* f) e\" f. _ - if mp[nx][ny]==1 or st[nx][ny]:continue+ t7 O i0 a. x' j, ~
- q.append( [nx,ny,step+1] ). p d# q+ G; D$ x7 c0 O5 D- F
- st[nx][ny]=1 o6 ^, r5 u- M* S
- bfs()
复制代码
+ a0 o9 {, o$ F, s2 s/ u |
zan
|