QQ登录

只需要一步,快速开始

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

python 解决八数码问题

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:44 |只看该作者 |正序浏览
|招呼Ta 关注Ta
题目描述】" h: N; k6 d) R7 l( F: }
6 k/ v/ `6 E) |0 q4 {8 {* j7 A% }! P
        在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
- ~$ U/ d$ _; l/ ~3 {( l$ u$ S  N. n
" y0 S  H% l! x( H2 d# X, g例如:4 Z5 V5 y* Q% H2 }: k$ |  U# D
7 I) I4 B2 w% X2 S' t0 r0 r
1 2 3
% S+ O) n, B+ v+ B/ p# |+ rx 4 6$ d% V. S' ~+ b2 B; s- d9 p
7 5 8
2 R7 e- N( o+ E+ n+ O3 E, b' [        在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):: X# j( I9 W" u, i# V4 n

" S: N/ M/ f7 A( v1 2 3. R8 B1 k' I& c4 H
4 5 65 y( ^" p1 k6 s( r3 x# f: c
7 8 x8 S& s1 M' q+ ~
        例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下
- |  K$ Q) o4 O
* z7 z& L2 |0 c0 b; s1 2 3   1 2 3   1 2 3   1 2 3
6 J$ d! s- G* @x 4 6   4 x 6   4 5 6   4 5 6
: X" N% D$ R& g9 i, g- l  {7 5 8   7 5 8   7 x 8   7 8 x+ G8 ^: r& W0 R8 X5 H
         把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
, h& V7 W. t7 r& X7 X2 M+ I% [3 H6 X2 |/ m
【输入格式】% f% y  L( X' u! l

, x* J# l. u+ M2 E4 j# T/ t        输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:* a2 {+ |  F1 U; u) v: O9 Y- z4 a
( k( p, ]: b1 D4 F# P& Q# J
1 2 3 ' x  O9 h& \, c0 ^3 }$ S* m
x 4 6
% R8 p' D! Y6 z3 A7 5 8 $ w: v- m: Y" j$ ~& A. D3 n
        则输入为:1 2 3 x 4 6 7 5 89 r1 B5 j( c# P$ q& Z7 X) U
$ k- l1 g' W1 \& P5 p0 r
【输出格式】
0 A8 J9 n9 l  e, R
8 k6 c$ X! F4 n# z9 z        输出占一行,包含一个整数,表示最少交换次数。
* G" o. |8 `0 C& n4 w
, c# \7 p+ q" m0 ~3 ]9 \* b- n        如果不存在解决方案,则输出 −1。
* x7 \# F' m* p0 ^3 Y" D. z
2 Y8 s$ {; W1 a1 Z' ^( t* [【输入样例】- v: ]5 j) }4 K( @

* ~9 I# z8 ^7 O8 c3 P  L; _2 3 4 1 5 x 7 6 8
; s! d% V: Q( ^. b【输出样例】2 Z6 q4 n: X4 k6 O

6 n7 a4 D1 b' H- V0 P" v19$ I3 w: @1 _7 G: Y. U' c9 g
【解题思路】
) O' m. p8 O8 F# F4 A# r3 b% U4 [( i) `0 ~. L: p
        简答题,用BFS遍历查找即可。
  I  Z: ]& P: k  K0 V, @  ^
. K4 ^+ k, |+ S, w+ d! x/ Z【Python程序代码】
0 S. C' X$ H1 Z( |" K+ j1 J$ I  e4 R
from collections import *# D. M9 W# h: j) e
pd = ['0','1','2','3','4','5','6','7','8','x']
# n- q6 b7 @  p5 {# xnorm = "".join(pd)2 v$ i! ?6 s' R+ h
dir = [1,-1,3,-3]
( G5 V/ Q  n6 v3 q9 \, ys = ['0'] + list(map(str,input().split()))1 W: N% n$ V  d  @& v( z, f( u
idx = s.index('x')
( H8 P1 }! Q: r3 N1 Q4 R* S% ~! z& ymp = defaultdict(int)6 s* j- I0 n+ O2 m4 d3 O
def bfs():0 Q& v9 |) A" \: N  [
    q = deque()( N! m% t+ V6 M: H5 j, y
    step = 0
6 r# i, a4 ?3 `7 ~& y; f- z0 k    q.append( [s,idx,step] )' H6 C% U9 `" d8 @
    ns = "".join(s)
( c- o$ p1 Q( P    mp[ns]=1( N+ \% U: N& v4 B* S2 H) J# A
    flag,res = 0,-1
  c" G" q& V0 _- c; A7 q. O    while q:% t% _3 E" `+ d8 d9 u; n
        ss,sidx,step = q.popleft()
1 k' Q5 {5 U0 J/ y! U  g' I: H        if "".join(ss)==norm:
4 E+ `, w6 I1 G) \            res = step
# z/ m" t1 U- W: z1 B2 A            break
7 D  i+ A6 ~5 B7 i        for i in dir:
; l4 o! S, s0 m) G9 |! ]9 a5 }/ w            teps = ss.copy()
. A& |. O. ?, W2 A9 Q, V            nidx = sidx + i
: H/ A/ s8 m, O            if nidx<1 or nidx>9:continue
! f+ w4 }& M7 d, D            if (sidx==3 or sidx==6) and i==1:continue% H8 ~# J" n! z8 \+ d) I
            if (sidx==4 or sidx==7) and i==-1:continue9 d3 W% c! l! o; ~
            teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
, D& s! ]# R4 R            nteps = "".join(teps)2 O6 I2 Z( _7 M/ x+ p& o6 a
            if  mp[nteps]:continue
! o7 x+ v# g5 F: ?! k9 H            mp[nteps]=1
% h* y, P# X3 P+ @9 l6 j            q.append( [teps,nidx,step+1] )8 V$ Y7 f1 H+ P5 n% N
    print(res)
" T% t! @% R( H: |bfs()
" C# k/ i( Y, h
& M$ n0 X) L$ E
! u" d% y( w9 d
" A6 r9 e. x  @# w2 x; ?& D( y& l7 r8 w- o) M( e) t1 {8 I5 N
2 L8 Y; p/ i" ?' x+ J5 I

代码.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-6-16 03:21 , Processed in 0.404324 second(s), 55 queries .

回顶部