- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7951 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2977
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】4 e2 ` j5 @0 y4 B$ l* h: s6 o
0 q& ^3 k; X) f9 E 在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。0 m6 G" t2 f7 p3 @% R4 k
9 I9 T! F a; f8 f0 ]( D例如:' t( W' c# H$ h! v# B6 r
- j+ l% k% x( }3 h# t
1 2 3( h0 A: j0 {1 m4 ^; J
x 4 6
) Q; T5 x6 @0 ^0 m6 c2 y7 5 8( H l- ^1 q& F# V
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
. w7 n1 V0 }% e$ d5 X" w8 H+ @8 E: J7 y# X5 @
1 2 3
- l4 C1 g V) e% j9 w2 p0 t4 `" ]$ e4 5 69 J" I9 N+ x k% K+ p% q
7 8 x
0 C6 R- D: q2 y: Y4 `) {3 L 例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下. t7 y2 t* }2 | s. H
3 [# ~& a X! j) Q: D( l
1 2 3 1 2 3 1 2 3 1 2 3
+ o2 p0 i+ Q: K" ? a& O Lx 4 6 4 x 6 4 5 6 4 5 6$ u& K0 z) N/ J9 B" J6 |
7 5 8 7 5 8 7 x 8 7 8 x
' X$ j* g. C: K: P( Q" V* y: d) R 把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。# D( K8 y& p4 b4 R U
- u ]! B, W4 D, Y: V【输入格式】
u* x" L3 a; T W) t, m: a4 t
8 |3 S1 W: L6 K3 s" O! c/ J$ ~" A 输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:* q( t8 d- t3 y7 k) P' M
8 y) G" t9 K! |1 2 3 1 f' s+ n9 m6 @; I4 K* \
x 4 6
8 R" ]* o& m ?- w( _4 |% e7 5 8 ) {/ r2 m+ N" L+ }
则输入为:1 2 3 x 4 6 7 5 8
0 t1 l0 ]/ U9 g4 O, Y* }9 i
2 T# s8 R) a* G& K【输出格式】
7 ` t/ `' t# K5 L# C
`: l9 y2 U+ I( h 输出占一行,包含一个整数,表示最少交换次数。
) E( M# r9 u" h
1 p- _; |& z- e, J3 A 如果不存在解决方案,则输出 −1。! [" ?) u& L; r
* R# I# k" f, k8 T7 j【输入样例】
1 Q" d3 z, Y, w; i% W5 C
, U0 m, K7 b) I B) S2 3 4 1 5 x 7 6 88 O( Y8 B6 R; }! j
【输出样例】
0 e! z, Q& i$ i+ g5 _0 O, \/ N* @ q6 M" P( \! m
19. N+ M8 I: q9 d3 C
【解题思路】
! O4 t3 A2 V; v) }5 p2 e' x1 U/ V7 ?4 |/ H
简答题,用BFS遍历查找即可。* \( _/ v( M! w5 i' ^3 p+ @; I. }
- Q, L. ]" V& ~
【Python程序代码】
. [. L4 s6 L9 @: a- B( ^0 d8 I3 H6 N& Q+ m4 J2 _5 y
from collections import *
. o& x/ X5 t2 W; a5 A r+ J b: Bpd = ['0','1','2','3','4','5','6','7','8','x']
o2 t; J8 X" @# s& ^% [norm = "".join(pd)/ s) n! Z. K2 }$ f; d/ P# J6 O. }
dir = [1,-1,3,-3]6 q; e9 A6 _. {: U! w( h
s = ['0'] + list(map(str,input().split()))
" E# A% ]. U7 q, i$ Y8 Y q4 n1 nidx = s.index('x')# E G; G+ y! ^6 ]% N: { ?
mp = defaultdict(int)
; J, f! l6 G& _( z: q* A3 o0 Ydef bfs():0 }) G! l! r7 R4 e/ I' A
q = deque()
, Q e r" q' T( j. Y# l% R step = 0
! N) I& S( M. u. t q.append( [s,idx,step] )
& J$ z ~6 r F0 ^ ns = "".join(s)
7 ?7 }; ?( x* N6 {- P5 U/ x mp[ns]=1+ s/ ]' e/ q! b, Z. F1 b a
flag,res = 0,-1
P3 t2 d l6 `1 s& G( P while q:
) S2 f f# N- D0 S$ I q ss,sidx,step = q.popleft()# @; C f v. k" Q) r1 w
if "".join(ss)==norm:
& H* Z8 R5 ^) p+ X# A4 U# F+ H ~ res = step% ~: F! E# \' X( t3 o- b
break" r- n- _9 W6 Z. H m
for i in dir:& f) R) H' E' @; B- z: ^7 S
teps = ss.copy()' ?9 m* M8 A# K$ ~
nidx = sidx + i9 c* N7 F F% |" k1 g! I: E& ]
if nidx<1 or nidx>9:continue( |& k6 E; X! ^, M5 @& m& I! b; ?
if (sidx==3 or sidx==6) and i==1:continue' D* e4 Q9 |0 k$ R U7 B( a6 ?
if (sidx==4 or sidx==7) and i==-1:continue5 ^' j2 E+ t! `/ `2 v0 C# ^
teps[sidx],teps[nidx] = teps[nidx], teps[sidx]. E; g5 n3 t2 f H
nteps = "".join(teps)
% _& x$ O( z/ o2 T4 a4 P if mp[nteps]:continue3 S! {$ o+ Y$ }9 }2 R# K9 P
mp[nteps]=1
4 r |# R* |+ I q.append( [teps,nidx,step+1] )
; X8 M. S3 F9 D! }8 Z# `: q+ j7 D print(res)# D6 S4 t/ @1 n6 ]8 c8 ~ m
bfs()
& }$ O/ [$ O& b d9 H h j
2 n' I5 \& H( ~5 f* Z& K4 J; Y! [9 p- Y+ [1 j
$ `6 o0 n% o) ~7 P
- p1 u0 }& X$ _ z' {2 h0 C
. d+ ~$ j ^$ l |
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|