QQ登录

只需要一步,快速开始

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

python 解决八数码问题

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
题目描述】
, k" H7 h# d6 E- S4 \* ~' X" D8 N3 p6 O2 \9 T
        在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
# Y  v! ?8 o% f( v! Q2 g4 A: x( k1 {) _0 \
例如:. J  n  z. J1 z3 T& \

5 \" P1 R" G9 q1 2 3
! H6 o6 h. i' t# e7 A' O9 Fx 4 6
" D) h! k! a( _8 Q7 5 8  `6 H: F( X$ ]0 J) k9 L) i3 u% v
        在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):2 n. i) }( J7 v1 P' z/ }
! O* {( P0 m* R/ `( ~$ h
1 2 3
: e$ U) U( l" F( D4 5 6
' \( s) Q/ s! }+ T7 8 x
0 g7 ^  F2 z- a  J/ n& u) C+ w        例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下
3 y. P$ t/ f5 T: K* ^: s1 R( j) q7 @# F8 l( k
1 2 3   1 2 3   1 2 3   1 2 38 l+ V/ Q& z! i& p
x 4 6   4 x 6   4 5 6   4 5 6
% U. U( A5 e2 K: G, o+ ~- y' U. e) M7 5 8   7 5 8   7 x 8   7 8 x; p% J$ a4 K' _" [
         把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。, s! \6 \/ ]+ k3 T) R

2 w7 Y7 U0 B: T' p; l/ z【输入格式】5 J. K: j3 Z0 O7 i9 Z
  T$ V; h' g" ~3 b
        输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:, \, \/ w& V( M" P

1 @  ]5 Z% y, a9 S" y  n- A1 2 3
. w& J& a% l, c6 e! v, Z0 Kx 4 6 3 @' a: K. w9 U# y. A& O. Q) }
7 5 8
& g0 @3 o1 x  Z* w        则输入为:1 2 3 x 4 6 7 5 8
3 J; C! L, [3 p+ h! \# A& _" ]3 _$ |# @  i2 P$ X7 w7 D
【输出格式】
8 Q# a  `6 d6 A6 }
- Y+ F0 g& [5 a+ V: B* j        输出占一行,包含一个整数,表示最少交换次数。% v, x& q2 _% F7 h/ [' z
5 s9 z3 e- n4 K, `
        如果不存在解决方案,则输出 −1。$ R$ `0 z7 p/ S: L
( b3 Q: |0 w+ C* x2 a4 J6 r
【输入样例】6 i2 ~; x! w/ l# K; d  Q
4 |: x+ K5 m4 R$ l# w
2 3 4 1 5 x 7 6 87 |3 j5 M8 K: x
【输出样例】6 C) x7 J& {! q- }2 ~8 O

# m/ [1 J9 K0 {& O# A19
2 }. f1 w% z3 d) l% R5 P' E【解题思路】% r5 p3 R9 e7 v2 _9 R1 D- I
9 J" c/ b* x6 \6 e
        简答题,用BFS遍历查找即可。6 u% s& j% y# K2 B& N. N

! m/ W, }% G& w【Python程序代码】) g3 A! [& K9 c7 ~/ {

* _& U# O/ a8 J5 b/ `from collections import *
7 L/ \  q5 f6 \+ ?2 t) x$ g, Qpd = ['0','1','2','3','4','5','6','7','8','x']5 W! `) T1 R6 |. w( h4 `5 p
norm = "".join(pd)
6 f1 n7 M, S. r% V2 g1 t7 Ndir = [1,-1,3,-3]7 Y" M( ?. h2 D; K' Y0 l
s = ['0'] + list(map(str,input().split()))
& m  Y% f- P1 bidx = s.index('x')
' |8 K+ e' L" ]2 v; W; tmp = defaultdict(int)
/ T! _, {* h3 c2 s* v; Y  i/ e9 hdef bfs():3 i, a1 |$ M# c- }. |2 R* D# {
    q = deque()
% F0 B8 m2 {0 \+ |8 u  p    step = 0' m" u9 l' i' H% g
    q.append( [s,idx,step] )
( ]. b0 N+ J6 M" U  F+ s2 x    ns = "".join(s)! N( N1 b% J3 p! R2 h+ O" h# L
    mp[ns]=1# @/ A- }9 h$ L# n2 c9 k+ h
    flag,res = 0,-1
1 O7 w" a0 B# r* J/ G- N: M3 Y    while q:8 `, u$ e1 c, G3 z% {+ z
        ss,sidx,step = q.popleft()
' w* E% G- P) I0 w        if "".join(ss)==norm:
1 u# q, {$ ^2 x9 B& Z5 n            res = step4 v% D5 L2 q" a, m2 H  l
            break3 H6 m  `6 t8 H. }
        for i in dir:/ j% V0 F1 T& Q9 O8 @
            teps = ss.copy()
4 n: y6 a/ }% J( O1 n0 j            nidx = sidx + i9 b! P3 t; `  y1 ^6 v- y0 k3 D
            if nidx<1 or nidx>9:continue
3 [; c/ ]% @3 V) `            if (sidx==3 or sidx==6) and i==1:continue
6 L4 {% l" F4 M8 B, R' |9 C            if (sidx==4 or sidx==7) and i==-1:continue, k% @3 q# o5 X3 P# e
            teps[sidx],teps[nidx] = teps[nidx], teps[sidx]/ V6 I5 A% M/ \7 g% C2 z
            nteps = "".join(teps)* P. a! m. d% h+ ?
            if  mp[nteps]:continue4 I6 V. y0 K8 B! v) p" f
            mp[nteps]=1
- L3 N0 ?1 e7 ?* c& m            q.append( [teps,nidx,step+1] )
8 t$ E5 X, N1 Q: ^    print(res)/ q% n4 k* F2 g) Q% E. n; n5 P8 f. J
bfs()
0 H/ M9 D+ i% q' }$ n: ?5 c. h0 q9 w" Y7 E  t
2 S5 g/ ^; n9 J2 d* ^0 M

1 ]# U/ i% u# K' p% w7 p0 o% R( D( A. K0 R5 t% B( f- ~( P

9 Z* |+ W' y, c9 X+ @# q* e$ M4 T( y7 W

代码.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-7-29 10:36 , Processed in 4.716736 second(s), 55 queries .

回顶部