QQ登录

只需要一步,快速开始

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

python 解决八数码问题

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
题目描述】
2 E! d/ {3 q- e7 z
3 V2 H1 c2 X) m( r  Y        在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。& N! I. w9 `0 l

  X7 {+ J! C. K1 B3 @7 z' }例如:' j# m  M3 }/ g* u
8 c0 N4 h8 w7 j: D8 ]- M! p; N
1 2 3
, Y7 Q- V$ K  M8 B, C" rx 4 6
: G. l1 ]# Y$ N( {8 R6 q7 5 8
6 i4 \2 G+ n; N' k6 y. l        在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):2 |3 j  e( A& ]* ?9 Y3 |2 c: a

# b5 j! |) R8 l# z# j; I1 2 3; d/ }4 O8 e1 h) J( ^
4 5 61 \4 q& n1 D. x3 x! R7 j' s1 m
7 8 x2 X" V4 p" p& t- p; `
        例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下/ \! d& M; t* X4 ?. h

4 n7 S! N  d3 d, [- X) |1 2 3   1 2 3   1 2 3   1 2 37 h( s1 u) a/ E) m' z
x 4 6   4 x 6   4 5 6   4 5 64 _2 O; S* E$ _+ e7 h) b
7 5 8   7 5 8   7 x 8   7 8 x
% M0 x3 r; q6 Q         把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。0 H% c% J% n" w  _" A' l# C

3 k3 h1 }3 N4 z. _【输入格式】
9 e. B  X. i- J9 F/ `
; u  s. f9 h0 j6 `        输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:
: o5 Y4 H7 S: ]# }, y5 H& A' D
" }4 c3 u! E6 S' u2 K1 2 3 7 c: ^! g, a+ e( p$ v! }
x 4 6
2 y3 U4 ~. }+ J2 V7 5 8
4 T3 a/ e5 h- k# U/ \" P4 ]- \% p- f        则输入为:1 2 3 x 4 6 7 5 8. F1 v& ^& Y2 a) q5 T& B  S) V

# E7 e, T4 i) h【输出格式】% D/ |7 A, y' \4 l
# r* Y- q4 r  B5 ~( m! B6 [. O
        输出占一行,包含一个整数,表示最少交换次数。
# |1 p6 E4 T, |8 W, s1 Q
! _2 R# \$ A. Z5 b% b        如果不存在解决方案,则输出 −1。
& C1 ~# \% |3 G- y/ U7 D' M  x9 ?7 V* j# u. i2 C: s
【输入样例】
2 `' x  @: p1 c1 S. R: e8 ~, N: U  e. N
2 3 4 1 5 x 7 6 8: C+ `: D% N) P3 R$ o! {
【输出样例】+ C8 U1 g9 d8 u; }' s' y+ K
* s1 F$ H+ x& R4 Q' }
19& N* P- M: e) k  x
【解题思路】
6 q: R! s9 Q: C! c/ v
) F/ E- Q. k, K" W        简答题,用BFS遍历查找即可。6 c9 G' P8 {, S1 z$ r
5 T0 J* Y3 ]0 L; m- a) {# K7 g
【Python程序代码】
* F  h$ ?5 y4 `( y! V3 {
, W; S6 [* ?3 Y) T6 W% R7 z5 ^from collections import *
) j! q. Y5 f0 e- Rpd = ['0','1','2','3','4','5','6','7','8','x']
# C+ f) m' m7 G" onorm = "".join(pd)
% U! N- t" Z: `# v" q# v) T8 A& kdir = [1,-1,3,-3]" e. \3 q1 A0 O! R
s = ['0'] + list(map(str,input().split()))
7 S$ ~( M: J! O- r1 ?! pidx = s.index('x')
- i% j2 e) L5 _  Wmp = defaultdict(int)" G& e4 o6 A8 L/ T' G; P* O9 \
def bfs():
- t8 [  _/ u9 W9 U4 |    q = deque()
) p0 E! p% F  P5 v1 I    step = 0
" |  y; g1 R2 x* r    q.append( [s,idx,step] )
3 M& Z: b; E) \( C' N# ?6 |    ns = "".join(s)
3 l2 V# c( t/ J* o7 e( G2 Y8 ^    mp[ns]=13 Y7 k; Y  I9 b$ U
    flag,res = 0,-19 [( P; v5 n  t( B( J, t, K4 m
    while q:/ S* p% _1 ~: i6 }0 [6 F  ~
        ss,sidx,step = q.popleft()
) m% {- T! L! g& |        if "".join(ss)==norm:$ G7 B$ g! Q; U8 r# o
            res = step
$ F) z  l% q, }& p            break
2 v" w! @9 P8 t  C        for i in dir:
3 ^% b, V' W% \$ j$ W. T            teps = ss.copy(). [- k% r# b- \9 f  Q0 f
            nidx = sidx + i
' P1 h8 x& G4 d; }            if nidx<1 or nidx>9:continue
, _0 j; U$ I1 z- b( y, ?; g4 }            if (sidx==3 or sidx==6) and i==1:continue/ Y2 m$ h" e2 K: l0 B& i$ r
            if (sidx==4 or sidx==7) and i==-1:continue. g6 y  W  |2 K5 W( _% m* Z' A
            teps[sidx],teps[nidx] = teps[nidx], teps[sidx]5 [+ m" t/ d4 n0 `+ w! j+ U0 Y
            nteps = "".join(teps)
! F8 d% Z4 [. d( e            if  mp[nteps]:continue
% M2 j( u! o" M' ]: w2 G            mp[nteps]=1
8 N% Q( P$ J- O$ [- ?9 l! X            q.append( [teps,nidx,step+1] )
' H8 [+ D( [7 u% A1 A    print(res)7 }5 R( {6 T3 I
bfs()3 l% ]8 E$ P: P7 I9 g% ]. E

/ ]& O7 u: K0 U1 g+ M9 L  k
0 p' Q( I+ l1 Y3 ~# d( z
' [: O* s) j/ ^6 ]$ C& i4 _
. ?* O7 R  [& r2 c# j# z, K6 O8 j* x% o8 {" a1 p0 P. l( o

代码.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 18:52 , Processed in 0.571935 second(s), 55 queries .

回顶部