QQ登录

只需要一步,快速开始

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

python 解决八数码问题

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
题目描述】
+ @3 t# Z# T$ Q- ?0 L+ L  R7 X8 u' \
        在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。5 p5 B3 K- Z7 ^6 v

- e8 P. i' s7 K/ w+ f* }$ ?% r例如:
0 d" [- L4 S) I+ M. F$ ]
! R8 g4 t1 a+ E, C( R. n0 x1 2 3
/ Y/ k: T! {3 W! f8 hx 4 6; w9 Y  l, E4 C2 q; y8 h$ k9 V3 @
7 5 8
! b' V6 Q& D" T5 V7 J  l  s, O& G        在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
; i2 F! l/ o7 f  r# @; O
5 }+ T9 Y: b) T% `2 O( M" N1 2 3% T& n/ ]5 {2 I1 ^9 F1 D. w
4 5 6- A" ^% p: E3 x! P; n
7 8 x" x$ `) p7 ~0 \8 l
        例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下: U+ D, m7 F, ^- U7 r

) ^7 G3 F. h+ j. C% @' C/ p9 _1 2 3   1 2 3   1 2 3   1 2 3
- |! D9 v. o* W5 E  _' zx 4 6   4 x 6   4 5 6   4 5 6
3 m3 Q0 P0 Q. Z- @8 \7 5 8   7 5 8   7 x 8   7 8 x
; _* {- g! [0 G         把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
8 u( [$ X' b  \2 v$ F, e0 C/ [, C; P- Z
【输入格式】' M! ?3 f- _8 P& [
4 ^  t$ C* i# W  m( B1 {0 ^
        输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:$ W$ T6 q0 l& x6 Y3 Q8 j

. l3 {% l, U* }! H1 2 3
, ]5 x! r; b& Y: \& Wx 4 6
7 Y' h& ?3 B/ B: R% C8 m7 5 8 3 D7 F% b! @: r2 h
        则输入为:1 2 3 x 4 6 7 5 84 b3 r6 ^1 v% m( y( H+ Q* P
. Z8 N& W" t: {/ d8 i
【输出格式】- Q9 A* t* P( e+ ]3 q: l& _2 W1 d
0 b: W, f: f# @2 S9 c9 `: r
        输出占一行,包含一个整数,表示最少交换次数。
% U' i% p$ L6 ?) i$ \2 v2 Z, W* W! o+ _5 d
        如果不存在解决方案,则输出 −1。8 K; P* H' g5 R1 T6 E; g

  F, x" }* c  D9 ~3 [6 W7 d【输入样例】
' |2 [8 {, Z, G( X
  I2 C; a" C3 Z1 a7 a- T6 ~2 3 4 1 5 x 7 6 8
5 r4 h" E: H9 c: q& Y  D, I0 @【输出样例】6 z! n+ E9 Y9 f: q$ D5 \' n

8 f) l; @% B1 P: B* ^9 w19
5 ~& Q2 [, d' q' H【解题思路】
- D7 p! a. J; Q0 `; V: B8 P: @- F" r4 A* m* Y
        简答题,用BFS遍历查找即可。: t/ X$ y# @+ U/ [" ]: d% I' y

5 g1 y% H" u, F& |# C8 \【Python程序代码】
& l4 k+ l: S" o$ }7 B
& W& U1 H$ h% ifrom collections import *
. e& y3 P- C6 ]) rpd = ['0','1','2','3','4','5','6','7','8','x']( o# |! K9 h5 _$ A
norm = "".join(pd)
' c5 N0 `3 M! O( w2 F  {* |$ Udir = [1,-1,3,-3]
2 M# |2 i( `7 w2 H" {s = ['0'] + list(map(str,input().split()))
3 B3 k; ~9 M+ E  k/ Lidx = s.index('x')" Q9 K, p2 B- I# K. Z' @# P7 Q2 W
mp = defaultdict(int)
2 _5 h1 B  w5 s, F6 y& f% a5 r" @! Edef bfs():8 H% A) X  L4 |/ h6 \: }
    q = deque()4 s: l! o, A. b/ _% D3 U' P
    step = 0
. o: s5 a1 B! w+ E: j% E) _6 k    q.append( [s,idx,step] )3 u& ~. a8 ]/ |. N2 r) |# W
    ns = "".join(s)
- U  P4 W( \: p6 K' }5 |    mp[ns]=1  o5 c3 e  ]% E* v
    flag,res = 0,-1) n$ O% \. T# ^: d% T5 c8 k
    while q:! Z; |0 W! X3 P
        ss,sidx,step = q.popleft()
, C8 J$ ?2 [8 t  q* f  |# d        if "".join(ss)==norm:
# Z) T! w: A' v! c8 R3 W& L            res = step
& @% q  b  Q* L0 |2 t$ g            break
6 W- \2 y0 x) z, ?; E- g# A7 P0 _& b        for i in dir:
! g" |- W0 q! D* J3 u7 X            teps = ss.copy()
! S: ^" t5 l8 O            nidx = sidx + i
; a7 S; }1 j4 _, r' r            if nidx<1 or nidx>9:continue
- L1 C2 f7 ?) ~. E+ Y; V            if (sidx==3 or sidx==6) and i==1:continue, f4 F( N. \4 R  t3 r4 M. ~( p; \6 o
            if (sidx==4 or sidx==7) and i==-1:continue
% M4 Z* z6 r# t" S1 T  \            teps[sidx],teps[nidx] = teps[nidx], teps[sidx]8 v3 ^; x- {8 y8 y
            nteps = "".join(teps)
3 T; b8 M0 _# e            if  mp[nteps]:continue# N$ ?! [9 m+ M; j: H  |
            mp[nteps]=1. M) R" @9 p* h2 e5 Z& h
            q.append( [teps,nidx,step+1] )
! I/ l8 |# L8 O' n$ J0 A    print(res)# h6 ?8 E; J6 N4 p
bfs()4 G$ e6 I# h% b
# _0 ]; e0 B+ L* H6 \9 O
5 t' i/ P3 O8 X3 H

1 y+ p5 j3 f" S6 N+ j* D* _" x: ]1 F" ]" r: d% B4 e. R
  ?% @: r! V0 F# g9 q

代码.txt

2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

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-8-25 20:03 , Processed in 0.553080 second(s), 55 queries .

回顶部