- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7951 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2977
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
9 C7 V }' J0 n" ~( s+ Z3 U5 s
$ T; o: p5 O3 v0 T 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。
" x. ^+ o: W. t' H! q3 C0 ? m
2 r: }" `5 `% P9 m【输入格式】; i" I8 z# G4 H" h# b) }- g$ c
) y( |( ] f/ {$ v& k; a/ \ 第一行包含两个整数 n 和 m。
3 e$ k! o$ e( X
; z- l" p, z2 ~4 r" j! l* W 接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。
; N3 m1 c. d% k! z& e+ P6 M) k3 A$ M5 ?# F, G7 [
【输出格式】+ u3 g0 w5 q& u- j
, L; P# Q4 Z, }# Z4 x6 G7 T2 p+ E 输出一个整数,表示从左上角移动至右下角的最少移动次数。
, Q; l$ D- {& @! B" n6 b
$ w0 Q" G B! Y【数据范围】4 a5 C) P* C: H2 f# w: X$ i% M
_& N+ g+ r5 b' [- Q: j/ V- Z 1≤n,m≤100
* [ ]" w3 ?; H8 a5 j8 n" H8 i
; Y5 ]0 i5 } D5 ]% `【输入样例】
! N& e0 }2 P2 S) _: I; G. p, d1 H
% f O) x4 a; x7 w5 5/ Y1 V8 N, |, J2 w" B2 i
0 1 0 0 0
- H: E- { U" P+ a$ O! U: s p* S0 1 0 1 04 P2 v4 l6 v5 v) d
0 0 0 0 0
8 I; O3 ^, F" B' Y0 1 1 1 0 A i& Q% e/ w$ _; h
0 0 0 1 0* z( |) D, b. z6 p
【输出样例】
/ d9 q; o; }" V$ G+ [2 s
7 U. z6 ~6 @+ [- [1 w% t1 P0 O* R8
4 D" N3 `9 r9 g: y' R ]6 q9 w 【解题思路】& m* y+ a8 z9 @; j2 y. |9 Z( f
a" W& p% v' G# z! k' \: P
BFS的典中典。- from collections import *! W' ^. ^- g0 Q- V9 D) b
- n,m = map(int,input().split())0 b6 }. E3 @- }* _# \' W
- mp = [[0]*(m+5)]
6 {: S& i9 M) v0 Y9 E - for i in range(n):
' _4 P- j @) G* M8 U# ]* X - mp.append([0]+list(map(int,input().split())))\" m! Y$ w: N9 p: _# Q( X
- dir = [(1,0),(-1,0),(0,1),(0,-1)]' T* O3 Q0 y% D6 j5 K( o) E
- st = [[0]*(m+5) for _ in range(n+5)]% I4 c! p% w% J2 G8 v9 u
- def bfs():! U/ S6 j- d9 V' ?3 Y
- q = deque()
\" [& G' A! H' q - q.append([1,1,0])$ ^& a/ h% \; {* l. _
- st[1][1]=1
8 ~! ~0 l {7 u6 E - while q:
- z/ f1 @* K# T4 y; h3 Y - tx,ty,step = q.popleft()
U0 m+ |: P3 ]- K H5 R - if tx==n and ty==m:2 T. M% j) `, G3 k( c\" X
- print(step)% k* k- L1 D, k
- return
/ M2 T& _ ~: g; W. W% ] - for x_,y_ in dir:
# r7 _7 A# b! N8 E! e - nx,ny = tx+x_,ty+y_
# k5 ]7 _% b8 q1 S - if nx<1 or nx>n or ny<1 or ny>m:continue4 Z* ]0 m3 c6 N, ~
- if mp[nx][ny]==1 or st[nx][ny]:continue. M1 p' _- J+ u3 b/ U
- q.append( [nx,ny,step+1] )
) `6 c: y* S- L' T - st[nx][ny]=15 q6 m' k: Y$ T/ j& H
- bfs()
复制代码
: H- s8 H% |! V. L( O; k2 i3 V |
zan
|