QQ登录

只需要一步,快速开始

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

python 解决八数码问题

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-20 11:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
题目描述】' M+ ]8 m# B+ u
! \0 K, s- p+ k/ \+ J/ I* B( @
        在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。+ N( [  X6 t* B" d
- O$ H/ O! n8 d) l$ W9 _% C" X
例如:
! ~9 W4 {6 l# \( |: t3 Q. k& ?3 P& ~( f$ [1 ]1 a
1 2 32 T( F# M) r, L6 M
x 4 6: l+ z5 \* m: Q4 E( w( b
7 5 8' K5 i4 O0 \( l  O3 t  a  J( R
        在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
1 f4 b& G9 N% a5 e/ z  K2 X& u' A' J2 L
1 2 3
8 z- ]5 G+ A+ y/ f7 B  H% U4 5 6
( ~: `0 K% T& o. H) q' p, L7 8 x
  f8 j8 L( i% F        例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下
+ d8 U% U6 D3 `) z( F
/ |8 _7 v8 z$ g1 }" m1 2 3   1 2 3   1 2 3   1 2 3
! ~# H; F' a1 O7 {' \" S! _x 4 6   4 x 6   4 5 6   4 5 6! k9 K6 \# h4 t5 a
7 5 8   7 5 8   7 x 8   7 8 x2 e  g" @9 }: O+ j; f
         把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。+ o2 W! F3 r- G$ n  A$ W

( V( g2 }6 C% ?/ K& t" l1 w: `0 n【输入格式】+ }6 s1 ]6 |# H, S8 D5 s

- R3 o  l  J* N6 I: A6 Z. B        输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:
) f1 p/ b7 V5 b' y: f6 Z% E3 A$ ~; ^! X* V9 U
1 2 3 / r8 G1 p  M. L2 ^. z4 X  ~
x 4 6 4 q) u- o) ^: F2 N! C
7 5 8 . a5 J5 g6 k$ y9 W
        则输入为:1 2 3 x 4 6 7 5 8' r# T2 V% y0 w6 ^! C2 a. r" t

0 m: a6 \0 W- \. X( e5 ^  w! V/ c【输出格式】8 O9 ?6 I2 `/ v0 C

( c) M5 b7 @& f1 T, o6 _        输出占一行,包含一个整数,表示最少交换次数。3 M, r9 R! ]. n: F' B

8 G+ H  c2 N: z( e        如果不存在解决方案,则输出 −1。( i2 f5 H4 M7 Q, P

0 V9 d4 d1 I$ i8 G! K1 }7 x" N, z) K【输入样例】5 b  N6 o( p+ p4 l  x. r

1 n8 M( K& m* v" W2 3 4 1 5 x 7 6 8$ ^4 l: G3 L8 M
【输出样例】3 C" z# @3 h( e5 a

2 O8 ^6 O5 B0 V) E  ]9 s! l19  l% {4 q  N! J/ }8 [
【解题思路】
- {3 r. _0 X; m# `7 @
$ A+ P, W) y8 G        简答题,用BFS遍历查找即可。
. x3 O9 o0 w/ k: C' a' n2 n. Z6 g+ Z6 i  y# L
【Python程序代码】- ^# T7 I3 N: l: B

! S6 c9 \" I  P3 {5 zfrom collections import *; n$ W' r& m# B: p2 `
pd = ['0','1','2','3','4','5','6','7','8','x']
* a7 J5 x' {/ X) t; ~& Unorm = "".join(pd): I, u' X6 U- C
dir = [1,-1,3,-3]! E9 |( z, Y# h2 ^6 X. ?* Y
s = ['0'] + list(map(str,input().split()))
/ w4 {; ]4 ?; N7 F8 widx = s.index('x')2 C- L* t% ?% U  X0 w# p
mp = defaultdict(int)
7 d! X8 |; N- U4 Y; {1 wdef bfs():% l% H( ?% [' }9 s9 e+ H
    q = deque()8 f$ X+ a$ _! \4 F
    step = 0  V. ~1 D) T# U8 N/ f
    q.append( [s,idx,step] )" r/ r0 d: F3 |+ K" [) C
    ns = "".join(s)9 x; u; L3 p* X4 T
    mp[ns]=1. }* W/ x! L0 X1 Q
    flag,res = 0,-1
8 c" S% S2 b# w1 W0 V    while q:5 l2 p4 N' O* ], h. g# J& W
        ss,sidx,step = q.popleft()- @1 A" D1 Z& O# \; @$ k3 |2 K' I0 H
        if "".join(ss)==norm:8 U  b2 e4 I' G. u  T9 y/ w
            res = step$ z0 W9 ]  F# y$ ?/ \) E
            break
. W3 U0 ^2 S  X( ~; Y6 m4 k& B5 i9 t6 K        for i in dir:/ b" S5 q9 [0 t& v1 R
            teps = ss.copy()1 @+ P$ u2 r: R2 q) j# n: A5 ?
            nidx = sidx + i
$ w* b1 j( b% H2 ?" I. E2 T5 ~            if nidx<1 or nidx>9:continue
4 @. {3 Q+ p: d8 `            if (sidx==3 or sidx==6) and i==1:continue
. c( d. y, R& {/ X, z3 t' W! Z8 H            if (sidx==4 or sidx==7) and i==-1:continue& f  Y* v" L' L# p& [
            teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
% o7 [1 c' ?+ P5 p/ P' m            nteps = "".join(teps)
$ r8 ~. i2 ]/ }" y( {            if  mp[nteps]:continue0 c# Y* @8 `* \8 F
            mp[nteps]=1
" \" A; c) i2 X            q.append( [teps,nidx,step+1] )* Y9 ^5 H7 }$ u& i4 g2 I
    print(res)
! b4 b- g  g3 V3 Q7 Zbfs(); f: R2 _; @/ x8 l# u% X- o0 T
! n, u; h1 h  [7 p+ i
) W5 I8 O: L' ]! o  |  ^' J% F
0 w( C4 F% P& A0 P  _" p7 J
: l2 v; [. g2 `  i1 E+ \
7 W4 B' q+ r. H$ b8 q& p6 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-10-15 04:55 , Processed in 0.272562 second(s), 54 queries .

回顶部