数学建模社区-数学中国
标题:
python 走迷宫问题
[打印本页]
作者:
2744557306
时间:
2024-3-20 11:40
标题:
python 走迷宫问题
题目描述】
: N1 @0 v/ L( }. ~& {
; N6 C. y* U9 M
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。
4 m* E3 Z' x) z& B9 H, w
7 V/ ]& p! A" G4 j$ I* }; }/ o
【输入格式】
. B8 j& G5 T* f- I1 T
! ]. R2 s- V3 q; ^+ }
第一行包含两个整数 n 和 m。
9 t) P; J# I/ B. D) x' r$ |& J
/ P# }: ^" [+ G$ w3 r6 T
接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。
: [( A- P2 e* z! }8 ~; I; x
# s% D! P1 ]% R( s
【输出格式】
) N7 h o3 ]1 {, e8 j' _
; h7 e7 i) |, q8 X0 t3 j
输出一个整数,表示从左上角移动至右下角的最少移动次数。
/ F9 x6 X/ D0 S7 n6 B( }
^1 u. v, ~3 P9 n/ l
【数据范围】
( r( V/ L, D* k a* D
/ Y7 L9 M+ a e) w* z9 g1 b" K8 x
1≤n,m≤100
1 ?8 F# p; i, J( K2 ]
7 N1 h" |* G$ Q8 z
【输入样例】
( }+ l8 ^& Z- b; ?1 J% H
. J; F6 u0 z) a3 H b
5 5
4 u. B& y; g+ }6 h) h
0 1 0 0 0
: n5 A, v. i5 U4 {
0 1 0 1 0
5 A- n( W8 t( C4 P0 \" L
0 0 0 0 0
" u9 U6 n* P) u# p7 k
0 1 1 1 0
) f+ ]5 r5 G$ \- F- Y V9 Q
0 0 0 1 0
, b) ^+ h- x- V! v
【输出样例】
t* a$ y- c" Z* R. b% X& w
2 o# ~. j0 T8 J. W- B, u
8
+ I$ h( n9 ^. a0 f# j
【解题思路】
/ G6 E. `8 ?% \: b" u/ i( H: F
0 Y4 k+ O, l; y& h3 N
BFS的典中典。
from collections import *
( W8 l$ ]% h* C, u* K
n,m = map(int,input().split())
0 i" s: H2 I }' P/ ]
mp = [[0]*(m+5)]
8 r1 w* ^' l+ I: L; ~# I5 |. T
for i in range(n):
) H( Z% ~4 X; H: N: j) \
mp.append([0]+list(map(int,input().split())))
7 w5 r1 |$ _; @9 ^$ G0 x
dir = [(1,0),(-1,0),(0,1),(0,-1)]
8 [, H* q4 f( o; C, z, k
st = [[0]*(m+5) for _ in range(n+5)]
4 o0 Y( b& q9 @2 h; p
def bfs():
+ ]5 \* `$ L$ Y4 A; L) x
q = deque()
% F4 k# E5 I: h8 d
q.append([1,1,0])
4 a7 f8 b( u) e/ S/ o" v
st[1][1]=1
7 v: c" Y4 ^6 @; B: Y% I
while q:
# O0 H! }/ \: z h$ J2 }( J9 k* p ^3 k
tx,ty,step = q.popleft()
6 _7 N$ r m- ^& v: b8 {
if tx==n and ty==m:
1 |! y$ W0 o* l4 y8 E6 E. ~
print(step)
0 C; ]2 ] @" b
return
8 g/ ^7 J2 z0 k$ `
for x_,y_ in dir:
t u9 l3 i1 A4 m
nx,ny = tx+x_,ty+y_
5 w+ V3 w& ^" `7 C* x; z
if nx<1 or nx>n or ny<1 or ny>m:continue
# _, f! s* B7 z# v+ P
if mp[nx][ny]==1 or st[nx][ny]:continue
8 }- H9 c! |- |0 j
q.append( [nx,ny,step+1] )
- @0 j- Y, D& k+ J. S
st[nx][ny]=1
6 h: C9 W! g4 [* b% ]; }
bfs()
复制代码
6 I# g1 o& k1 Q) S3 g" D! t
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5