- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
, k" H7 h# d6 E- S4 \* ~' X" D8 N3 p6 O2 \9 T
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
# Y v! ?8 o% f( v! Q2 g4 A: x( k1 {) _0 \
例如:. J n z. J1 z3 T& \
5 \" P1 R" G9 q1 2 3
! H6 o6 h. i' t# e7 A' O9 Fx 4 6
" D) h! k! a( _8 Q7 5 8 `6 H: F( X$ ]0 J) k9 L) i3 u% v
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):2 n. i) }( J7 v1 P' z/ }
! O* {( P0 m* R/ `( ~$ h
1 2 3
: e$ U) U( l" F( D4 5 6
' \( s) Q/ s! }+ T7 8 x
0 g7 ^ F2 z- a J/ n& u) C+ w 例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下
3 y. P$ t/ f5 T: K* ^: s1 R( j) q7 @# F8 l( k
1 2 3 1 2 3 1 2 3 1 2 38 l+ V/ Q& z! i& p
x 4 6 4 x 6 4 5 6 4 5 6
% U. U( A5 e2 K: G, o+ ~- y' U. e) M7 5 8 7 5 8 7 x 8 7 8 x; p% J$ a4 K' _" [
把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。, s! \6 \/ ]+ k3 T) R
2 w7 Y7 U0 B: T' p; l/ z【输入格式】5 J. K: j3 Z0 O7 i9 Z
T$ V; h' g" ~3 b
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:, \, \/ w& V( M" P
1 @ ]5 Z% y, a9 S" y n- A1 2 3
. w& J& a% l, c6 e! v, Z0 Kx 4 6 3 @' a: K. w9 U# y. A& O. Q) }
7 5 8
& g0 @3 o1 x Z* w 则输入为:1 2 3 x 4 6 7 5 8
3 J; C! L, [3 p+ h! \# A& _" ]3 _$ |# @ i2 P$ X7 w7 D
【输出格式】
8 Q# a `6 d6 A6 }
- Y+ F0 g& [5 a+ V: B* j 输出占一行,包含一个整数,表示最少交换次数。% v, x& q2 _% F7 h/ [' z
5 s9 z3 e- n4 K, `
如果不存在解决方案,则输出 −1。$ R$ `0 z7 p/ S: L
( b3 Q: |0 w+ C* x2 a4 J6 r
【输入样例】6 i2 ~; x! w/ l# K; d Q
4 |: x+ K5 m4 R$ l# w
2 3 4 1 5 x 7 6 87 |3 j5 M8 K: x
【输出样例】6 C) x7 J& {! q- }2 ~8 O
# m/ [1 J9 K0 {& O# A19
2 }. f1 w% z3 d) l% R5 P' E【解题思路】% r5 p3 R9 e7 v2 _9 R1 D- I
9 J" c/ b* x6 \6 e
简答题,用BFS遍历查找即可。6 u% s& j% y# K2 B& N. N
! m/ W, }% G& w【Python程序代码】) g3 A! [& K9 c7 ~/ {
* _& U# O/ a8 J5 b/ `from collections import *
7 L/ \ q5 f6 \+ ?2 t) x$ g, Qpd = ['0','1','2','3','4','5','6','7','8','x']5 W! `) T1 R6 |. w( h4 `5 p
norm = "".join(pd)
6 f1 n7 M, S. r% V2 g1 t7 Ndir = [1,-1,3,-3]7 Y" M( ?. h2 D; K' Y0 l
s = ['0'] + list(map(str,input().split()))
& m Y% f- P1 bidx = s.index('x')
' |8 K+ e' L" ]2 v; W; tmp = defaultdict(int)
/ T! _, {* h3 c2 s* v; Y i/ e9 hdef bfs():3 i, a1 |$ M# c- }. |2 R* D# {
q = deque()
% F0 B8 m2 {0 \+ |8 u p step = 0' m" u9 l' i' H% g
q.append( [s,idx,step] )
( ]. b0 N+ J6 M" U F+ s2 x ns = "".join(s)! N( N1 b% J3 p! R2 h+ O" h# L
mp[ns]=1# @/ A- }9 h$ L# n2 c9 k+ h
flag,res = 0,-1
1 O7 w" a0 B# r* J/ G- N: M3 Y while q:8 `, u$ e1 c, G3 z% {+ z
ss,sidx,step = q.popleft()
' w* E% G- P) I0 w if "".join(ss)==norm:
1 u# q, {$ ^2 x9 B& Z5 n res = step4 v% D5 L2 q" a, m2 H l
break3 H6 m `6 t8 H. }
for i in dir:/ j% V0 F1 T& Q9 O8 @
teps = ss.copy()
4 n: y6 a/ }% J( O1 n0 j nidx = sidx + i9 b! P3 t; ` y1 ^6 v- y0 k3 D
if nidx<1 or nidx>9:continue
3 [; c/ ]% @3 V) ` if (sidx==3 or sidx==6) and i==1:continue
6 L4 {% l" F4 M8 B, R' |9 C if (sidx==4 or sidx==7) and i==-1:continue, k% @3 q# o5 X3 P# e
teps[sidx],teps[nidx] = teps[nidx], teps[sidx]/ V6 I5 A% M/ \7 g% C2 z
nteps = "".join(teps)* P. a! m. d% h+ ?
if mp[nteps]:continue4 I6 V. y0 K8 B! v) p" f
mp[nteps]=1
- L3 N0 ?1 e7 ?* c& m q.append( [teps,nidx,step+1] )
8 t$ E5 X, N1 Q: ^ print(res)/ q% n4 k* F2 g) Q% E. n; n5 P8 f. J
bfs()
0 H/ M9 D+ i% q' }$ n: ?5 c. h0 q9 w" Y7 E t
2 S5 g/ ^; n9 J2 d* ^0 M
1 ]# U/ i% u# K' p% w7 p0 o% R( D( A. K0 R5 t% B( f- ~( P
9 Z* |+ W' y, c9 X+ @# q* e$ M4 T( y7 W |
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|