QQ登录

只需要一步,快速开始

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

python 解决八数码问题

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
题目描述】
2 b4 Q$ z% M* [" E  q7 c1 ~- V* O2 |1 C* m; p5 E" N& A  Q
        在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
7 m. E, @3 G5 D) Y. M+ u3 @' f: u7 x
例如:5 G$ u  S8 Z! i8 T! |6 M( w0 V7 p
% }+ a! J6 o  Y$ ^# z
1 2 3
$ Q( P2 q; {; Kx 4 6
" R3 p9 K8 j# E; J  z7 5 8. a2 m. _  ?+ `
        在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):/ W  I2 M3 D( w: K
1 p# j" @, a8 s- U
1 2 3/ S  ?# e9 e& H
4 5 6
" W( \2 Y  K/ k7 8 x
2 z& ?) B6 j6 L% n/ H        例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下
: ]( A1 M& O& w. ]
, x! q) M2 g8 G2 y, e0 H; e1 2 3   1 2 3   1 2 3   1 2 3. _5 |7 K6 z/ T. H" L  ~
x 4 6   4 x 6   4 5 6   4 5 64 e+ s( a; y  g* Y
7 5 8   7 5 8   7 x 8   7 8 x7 [8 }" [/ S5 x: `+ z
         把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
* I4 U- Z& }3 H
1 G& E# N+ C3 S. [+ g% j【输入格式】
# b$ H0 Y8 g9 e0 |# p6 a+ J, O
# U" `2 A5 z+ d/ f/ r! k' q        输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:
! Q9 I' J+ ?7 Y" |) o. u
8 i9 ^7 x6 }, p9 H7 g5 }1 }  u1 2 3
' O: @; @* D9 ^3 q0 f( Px 4 6
" L2 m6 {8 [' q4 Z4 A* w; C7 5 8
6 \6 [/ r% w; G5 ]5 i5 U9 l- D' i4 N        则输入为:1 2 3 x 4 6 7 5 8* z! g  b# w+ [$ c" N1 h7 t0 s$ c

( ]( e8 e( k# I4 Z【输出格式】
7 f, r5 H8 C4 T8 O/ |8 Q! N, S# X: F1 y* q
        输出占一行,包含一个整数,表示最少交换次数。% ]- K4 C+ X& \( X  k
) g4 l  U9 p8 p2 S6 w. f) h% j
        如果不存在解决方案,则输出 −1。% |2 @* T% O& [
& c, [; A& Q2 `$ d
【输入样例】2 k, w& C% s) y9 f4 l
+ [: Y( `2 e! V
2 3 4 1 5 x 7 6 81 D& F$ T0 Y2 F5 B# s3 t( V
【输出样例】) H# X8 _0 o+ ?. w+ {/ {8 K! N
$ `+ O1 m; Z$ w, n
19
9 q+ U6 j5 V/ M& U3 j; ~/ O【解题思路】
4 r# c6 e- z. C6 ^3 u
, q/ R2 d5 n+ C- Y        简答题,用BFS遍历查找即可。" k; v/ M. n4 u& |4 u( Z3 s0 H' N

) c8 X( s/ \0 ?【Python程序代码】8 `. X+ n. ]+ _
1 j, P" w: t: }# u2 v
from collections import *9 S  A2 \8 I* a6 y  z  `6 D
pd = ['0','1','2','3','4','5','6','7','8','x']4 w% F, _4 A3 ^% Z
norm = "".join(pd)
# @8 d4 L8 @+ |: J7 \dir = [1,-1,3,-3]7 V: w0 d* n+ O+ [
s = ['0'] + list(map(str,input().split()))
1 n5 U3 }+ w" W! d" V7 L7 Sidx = s.index('x')
. S) v; }+ C. u  }mp = defaultdict(int)! B  v) n! z3 L2 G, Y1 ]  V5 F
def bfs():
+ x3 k) x* S5 R% q4 `$ [4 w9 Y    q = deque()
0 _: w# T" C5 N9 \4 M& ]* s- e3 H    step = 02 T) {: y7 Q9 m/ `, t: ]8 ?
    q.append( [s,idx,step] ), V$ e, b, h5 e
    ns = "".join(s)
- B0 D8 m8 j% B; M    mp[ns]=1
% g9 y% K$ a/ e, \7 r+ v    flag,res = 0,-1
! J# n' v$ L  [    while q:$ Y6 D; Z. g. A6 h2 w
        ss,sidx,step = q.popleft()
* T9 p9 T% i/ |+ c7 @        if "".join(ss)==norm:
9 m2 l: s5 m. k7 g' S  ?            res = step7 A2 D  S3 H+ i" `; m
            break  _0 Y$ L( A) s' |
        for i in dir:
+ G% z) _+ h+ `8 o            teps = ss.copy()
+ I" @2 s2 p9 i; s4 Y! |+ m2 j            nidx = sidx + i9 r* o( n  B2 d3 U$ l* l
            if nidx<1 or nidx>9:continue
& N+ C/ S# m, P8 a6 ?; c            if (sidx==3 or sidx==6) and i==1:continue
3 W+ f: q1 J4 ~0 ]7 k            if (sidx==4 or sidx==7) and i==-1:continue$ r8 j; ~/ Q2 M8 X) b* A
            teps[sidx],teps[nidx] = teps[nidx], teps[sidx]  q3 C4 W4 d* ~# v  o, {
            nteps = "".join(teps)! q5 e4 p+ l4 D; G$ Z$ L9 x
            if  mp[nteps]:continue
0 a- N3 s1 E9 R: i1 r9 q            mp[nteps]=1+ e1 H4 B2 s, A& U3 q8 ?, _
            q.append( [teps,nidx,step+1] )  t) |7 q$ p3 T7 N
    print(res)
+ h& a# u4 ?6 A- I  n$ Z* g) p1 rbfs()4 k% j1 ^$ @  R8 X

# @( M9 n$ @$ W
% C; h, @0 B6 g! ^- [9 p* K4 ?) i# a/ U5 |- k: F% }

1 _- ]8 }; d+ L1 \0 q' ^3 @: ^* I* k$ {: b+ l9 d1 V+ 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-10-14 07:01 , Processed in 0.560914 second(s), 55 queries .

回顶部