- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
; G8 _3 I' n8 P7 G4 F( Q3 O# j, D7 Q
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。; `/ s0 U q% L% J e- Y# ]3 A2 k
$ F w+ y5 I. Y! E$ {* v, _( w例如:
9 @# P( K. v' \ u" w+ @% s6 A( ^) f3 g4 Q) i
1 2 3+ Y- Q+ E1 X: \5 R: B, c, W' e
x 4 6$ s7 |1 S' `7 p1 u! j
7 5 8: O' I5 X3 A% W3 t& a
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):/ h1 K T0 g* h$ d. l2 r# b
2 p; |! z4 f0 T
1 2 3
* U5 t$ _6 O* J/ Z6 z/ K8 _4 f" K4 5 6' k" l# f4 l) A9 P* Q
7 8 x0 d/ c; e- c; w, L
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下 K4 C7 P3 O, M3 N9 }' n! M# `$ y/ A
- x. \! N6 R- |. m: a1 2 3 1 2 3 1 2 3 1 2 3/ A" t3 D. F1 p; L
x 4 6 4 x 6 4 5 6 4 5 6
) i1 j- B, s5 O9 i; T- ?7 5 8 7 5 8 7 x 8 7 8 x; ?4 ^( j# s5 u6 `
把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
* s) w$ b0 Z- r6 e: j/ v. ?' d( G5 |8 v1 w( V; f. I* }
【输入格式】& P! h) W. u5 O8 v2 I# \
. W, x$ _# ^- H' _& S7 [' s) i' Z
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:) F2 U; X. f' }! k5 A) d
. ?2 s( z% j/ d' l1 p: a
1 2 3
0 `: O, \' Y* T) r9 q: P9 X) N w* zx 4 6 $ s( Z( ~2 Y; B+ ~
7 5 8 & ~3 y5 D6 J* u
则输入为:1 2 3 x 4 6 7 5 89 p9 e/ g1 c+ j( d( l0 o
3 y( Q9 r8 i( \# {9 ~0 g
【输出格式】$ I* G5 l2 Y8 Z2 M3 x
% @/ o; W6 Q$ \+ y! }9 D
输出占一行,包含一个整数,表示最少交换次数。
- ?7 |2 Q2 a4 W8 s2 {2 v# I8 o2 o% y* c; K
& G8 f% ^0 r; t 如果不存在解决方案,则输出 −1。
5 ?& h. |% |" j! s, e
0 F* \7 y1 n; w0 [9 y【输入样例】
6 s' {+ K! j& j$ T/ v, ^* h2 m; P9 t3 R2 [1 ]$ n" C: r- W
2 3 4 1 5 x 7 6 8/ p6 ?; g; r; v0 r: C* m
【输出样例】3 Y0 Z1 x1 i# R2 t, p) B! e
" B. V) y9 n6 X& ?1 l9 H0 D% l$ A19
n$ O( x% i4 @: |【解题思路】5 {9 q- `/ p0 r* \/ L9 Y
# f; \; f) Z4 | J* @/ z1 `# f; G9 Y 简答题,用BFS遍历查找即可。
: V8 W( f1 R: d1 f' q3 F9 C& W4 g$ T; C1 f3 i" o0 k3 r
【Python程序代码】, M1 R4 k& }- V; |' N# q# n+ J
8 d' I# P& R7 e8 x! D3 f
from collections import *
( ~; G# T$ |1 k$ k0 N* N9 apd = ['0','1','2','3','4','5','6','7','8','x']
& W3 {% \2 y! B, I- E" M) A ]$ Z Inorm = "".join(pd)
2 V& i; `5 v. Jdir = [1,-1,3,-3]
1 f% O3 w7 A6 L4 c2 @1 es = ['0'] + list(map(str,input().split()))
2 o) j5 i8 G; W. n% c5 A; z2 n jidx = s.index('x')
, e6 h9 U" U/ Y0 A4 @! f2 `mp = defaultdict(int)) F& M5 j7 O/ |8 C1 o2 [# L7 g
def bfs():/ n( K2 i7 `& I% g
q = deque()
% `1 X: f/ v1 x5 G$ x, c step = 04 t' O: l1 a( e& X5 }( z- G# f
q.append( [s,idx,step] )
0 w3 G9 ]# V, {9 [; u! P ns = "".join(s)2 X- n7 \) ? T& c9 Z* L
mp[ns]=1- z: [4 M+ `2 X$ y0 ]
flag,res = 0,-14 y6 A* W2 s* j' u9 l1 P6 F8 E
while q:
, `8 @. T- K8 x, Z" J0 y ss,sidx,step = q.popleft()
; x# z3 g2 N" W$ q3 K if "".join(ss)==norm:& ^$ g' y2 Y& E: B: G: ?
res = step, Y W/ U4 W g% Z3 S n
break
0 E& q6 t" u c5 Y5 q9 O for i in dir:
. n5 C$ `# C4 F( J4 }6 H4 e teps = ss.copy()" I/ ^0 W/ q6 e
nidx = sidx + i6 P2 I, z3 ?2 d& }1 h) p6 H
if nidx<1 or nidx>9:continue% h6 W* O; s; T% M
if (sidx==3 or sidx==6) and i==1:continue7 I% k, A8 E- x+ y6 h7 ]" Y& V
if (sidx==4 or sidx==7) and i==-1:continue
' h3 `$ l" w+ z8 _ _ teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
0 [+ X' v# k% H ] nteps = "".join(teps)1 v! S' m3 v( }8 A# i7 R5 I9 X
if mp[nteps]:continue9 v1 o( e) x l2 Z
mp[nteps]=1
% i$ D# ^& f+ Y* k( z q.append( [teps,nidx,step+1] ); l9 l' {, }. {
print(res)6 k: F( b% Z) b6 H L7 B
bfs()
! x; O& W; H) v+ C: {; u+ |$ t: n8 S2 U6 \
# f5 } O) u4 s5 N1 t: j* @
# G' u0 a# r& s" w
: ?9 T5 }9 e; J8 Q9 C i J5 o8 `
/ r3 B/ V$ c2 b3 c/ P( k1 W |
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|