- 在线时间
- 472 小时
- 最后登录
- 2025-9-5
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7679 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2884
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1161
- 主题
- 1176
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
M# r& o/ d" F" N0 I* J$ i( a" e& E# U/ {/ u6 z! ]
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
9 G, [6 Z1 \# r/ i; [( a0 _' b
1 X- g9 I4 l1 Q6 f; ^2 o0 ^例如:: U+ ^, U" X( `
- G& J7 I. u# s5 l7 S
1 2 3
c+ ~( O/ P% w( c& I1 W7 Hx 4 6
- z. {% j2 y3 W, O: s" z7 5 8
1 e% u6 U* I7 ?0 c! a9 p) y L 在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):+ s# }# ^$ g9 L( w: Z
3 n6 |2 T3 b) p$ T
1 2 3
5 o, E9 y1 n- E0 J$ f, e4 5 6
; D# ~! E0 o1 \- h. z1 P7 8 x5 C) t' H3 k' t* [0 R: R/ _* S5 H
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下- ^5 ?8 u0 k6 _. c3 Q
/ h8 k) K# t8 x% _6 ~9 ~4 Q) b3 o
1 2 3 1 2 3 1 2 3 1 2 3
. a; x/ E. \% H7 V9 ]: |/ Z3 n2 Vx 4 6 4 x 6 4 5 6 4 5 6
* F" k) u2 Z5 D7 5 8 7 5 8 7 x 8 7 8 x- l% E. | g1 n! U8 P
把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。( O0 s4 p/ W3 g, c9 B' j
, P" s8 ]2 G3 ?& ?* l【输入格式】4 y. r0 D2 A& }) u* X& \) T
, ]) s9 {) [5 z% P 输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:) a9 F. @; ^- G& G" T+ K0 R
9 O; I3 C! W! \1 2 3
" h& Z& X* I. ]5 q x; Q( z8 {x 4 6 & _0 ]% D! b R8 k+ ]; ]0 e
7 5 8
9 j/ X" H: s D* [# o" C 则输入为:1 2 3 x 4 6 7 5 8
9 e4 W5 z- Z0 G5 \4 y4 \: X2 l% G7 A+ v4 m. ~& D0 J- [
【输出格式】8 G( H6 A3 @" U( B
5 `7 D1 K) i/ z
输出占一行,包含一个整数,表示最少交换次数。
5 o* ^% v7 P' t# f, ^5 ?% @! z0 Y5 i9 g9 u
如果不存在解决方案,则输出 −1。
' Q* X1 Y7 P1 g/ c- l8 ~
3 ~3 \$ t7 y9 D6 a6 H: h& L【输入样例】
% b9 j2 q5 I( S# c( `7 q; A) V& K
; L9 w4 z; C2 _" e, h2 @4 n- N2 3 4 1 5 x 7 6 8
6 a" H5 M. D, _& k【输出样例】0 J) U1 e8 l! h" ?" j
* v& v+ c2 L% R3 P% t19
* p9 ^7 Z5 f0 f【解题思路】2 I! g# u+ B: c
: w8 F3 C3 ?. J7 T& ^/ I8 e
简答题,用BFS遍历查找即可。
. S, K3 b0 P7 ]! \7 p
( b2 Y6 l4 y/ J% p【Python程序代码】. C# y& w; q9 p
, Z5 p! q+ ?4 G% ~from collections import *
* Y6 Q+ G2 q6 s" v. L/ ~pd = ['0','1','2','3','4','5','6','7','8','x']* L$ L1 }* `, Y6 n) v, \; l
norm = "".join(pd)2 H4 \% D B* S7 h
dir = [1,-1,3,-3]
3 p/ e& j# o1 p0 t% w) x" p5 W' ~s = ['0'] + list(map(str,input().split()))% P" l+ [% r g8 K; Y& e
idx = s.index('x')
* L$ D' c( [! i4 w1 `mp = defaultdict(int)- X5 H$ Z' F' W8 ^% k
def bfs():1 U) b3 Q8 V" X' r# C: p
q = deque()- y9 D" s! f8 y: n/ e
step = 0
1 l- V2 `/ ]0 ?0 l* l) C ~ q.append( [s,idx,step] )
' y7 _& R6 S2 E0 @" F' \" L ns = "".join(s); c% y5 d) F" |3 w
mp[ns]=15 |4 q3 U% }: z; H9 K6 g* N- S
flag,res = 0,-1
. T8 l. N" g6 W) j* x9 w while q:
! Y V% q: N5 y' N' b" T/ o4 C ss,sidx,step = q.popleft()7 B/ m- M0 {3 C2 a8 M; p! U! H) [
if "".join(ss)==norm:
/ i; A& N3 D9 Y% l9 a2 [- f) Y res = step- e# M8 ~1 y9 g( c( S4 c3 z
break& J: Q8 W' J: u3 X9 w
for i in dir:; v) \; V2 W0 k9 F. T: m
teps = ss.copy(), C9 X$ q+ \- A2 G- c. U- U
nidx = sidx + i
5 P$ o- m/ |. I% k! @2 J; U i if nidx<1 or nidx>9:continue) z2 N# l0 L; ?$ o! ]) W
if (sidx==3 or sidx==6) and i==1:continue
% l" R+ {, t1 e' z- h7 T if (sidx==4 or sidx==7) and i==-1:continue2 I4 a C7 D2 R6 i4 R
teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
' i. @& m# @) v7 O' `. C, c J nteps = "".join(teps)
1 q! Y- _4 n3 r9 ^ if mp[nteps]:continue. F6 t8 W) e: I7 N: o
mp[nteps]=1
, G7 Z& J% P! C" V: O q.append( [teps,nidx,step+1] )! W7 \2 D- t6 j" |3 K) W
print(res)
: a+ O1 P( B4 V5 n; l. tbfs()% i: L5 [, c7 N7 r
0 V( j8 k! U7 V2 j
2 u" G, i, c, r: w4 [# ~2 ~. _+ Z5 S& X* o) _. p$ t+ s3 K
: U: A/ m7 e* D
5 w+ U' t+ C' z4 _9 n5 B
|
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|