- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
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
|