QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2579|回复: 0
打印 上一主题 下一主题

python 走迷宫问题

[复制链接]
字体大小: 正常 放大

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:40 |只看该作者 |正序浏览
|招呼Ta 关注Ta
题目描述】' z% [; D0 h1 U6 C6 R" p& ~( [# N
& u  f: ]+ ^5 {1 p* D; {( w9 \6 c
        给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。3 g; w  _( P2 m$ F! q( c6 X

4 ^  W3 W2 ~. o! G0 |3 c( a# K) {【输入格式】% ^, P5 V' A5 m& v) }- i

! e" q# ?( |& Q. l( U2 x  l' m  l        第一行包含两个整数 n 和 m。
# _# d: _  x7 H7 r* q% m. D9 R3 m7 l  R7 D
        接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。. {0 G# U7 h! g+ @

$ T: y1 o( c1 X$ `: w【输出格式】
8 p7 K0 ]: h: x- Q' _9 m- x- @  q( C( O8 z( S2 c) Q
        输出一个整数,表示从左上角移动至右下角的最少移动次数。
' p' ~2 {' M6 x9 N2 [; n6 Q+ b1 R9 @6 u7 S# W4 D1 r, n) X
【数据范围】
# c( }9 h# M6 X/ w2 J' H2 R; W: M' Q& [5 P6 K, r; `6 ?' `" t9 U" O
        1≤n,m≤100' W! D7 J) V. T/ A

6 p% g* L3 H+ ?0 ^" @/ j【输入样例】
; ?" k0 \# ^) T: U6 m( K: q+ D4 F+ X, x( _  b
5 5; [" O5 k- L. [2 O: ?2 t: p
0 1 0 0 0
# Y  h  Z2 s  H% f( p. p& A0 1 0 1 0, B& z/ ]6 P+ ^; J) ^
0 0 0 0 0
- b: c, w3 Y. g" H# n6 m0 1 1 1 0
  X2 M$ E' Q  ]* i/ Y0 0 0 1 0
" d: W/ I7 Y/ f【输出样例】2 |: D, h. Z' Y1 n
' f4 X+ ?( X0 A; x
83 c9 h. }9 t: w5 P9 G
【解题思路】6 E% O6 b1 A% o3 Z0 C! j- }& p4 w4 g1 ?
& F& p6 c/ S0 ~
        BFS的典中典。
  1. from collections import *
    0 ]& ^2 h$ i! e* Q2 C
  2. n,m = map(int,input().split())  [7 d) l) `5 L
  3. mp = [[0]*(m+5)]
    1 T; Y9 `0 u( D/ r0 |
  4. for i in range(n):
    ( u1 }1 i  s, m
  5.     mp.append([0]+list(map(int,input().split())))6 B, d. ^7 x+ t3 q4 f3 S
  6. dir = [(1,0),(-1,0),(0,1),(0,-1)]1 b& h& N3 Q* h  o# W. ~, [9 ^
  7. st = [[0]*(m+5) for _ in range(n+5)]. C) b& j' A3 P( z3 g
  8. def bfs():8 t# [, j\" C' t6 R& u( z
  9.     q = deque()0 E0 o% R, H  z+ y. \
  10.     q.append([1,1,0])6 K, u6 `6 x  v; s3 S
  11.     st[1][1]=12 f$ @3 m( q* Y# }+ P1 e& e2 y& c7 O
  12.     while q:
    & _; A6 P2 m- Y0 A% L
  13.         tx,ty,step = q.popleft()* n' u/ o; f# R6 o5 ]
  14.         if tx==n and ty==m:
    - U( h8 k* V; e* r0 H4 _9 Z# A
  15.             print(step)4 u. Q# V2 ]5 t
  16.             return% A/ @  g7 C  Q- Q% c3 f' l
  17.         for x_,y_ in dir:
    % P/ W' k/ g- G7 i
  18.             nx,ny = tx+x_,ty+y_
    9 e8 V! b/ _& x. L- D; m$ [! ^
  19.             if nx<1 or nx>n or ny<1 or ny>m:continue\" X1 m( |) R$ v( _7 u2 q( g
  20.             if mp[nx][ny]==1 or st[nx][ny]:continue
      z! v: f+ j6 `& |2 a2 u1 \4 W
  21.             q.append( [nx,ny,step+1] )4 {9 u: o3 Y% [4 ?# G1 i- v+ a
  22.             st[nx][ny]=16 F! ?8 ?5 ?) O: _8 B
  23. bfs()
复制代码

+ u" G' }8 c8 e8 U; _5 K
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-13 11:44 , Processed in 0.418338 second(s), 51 queries .

回顶部