- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7951 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2977
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】- G( W# D% l* H7 X
; _" y$ ^. F& u, u: y) z' L
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
0 j6 ]) f6 \7 I* k$ ]& D' f& x+ O
例如:: Y; r9 W& O. S6 t) G5 t
4 C7 N8 P7 C. ~) X
1 2 3
6 J6 M$ F' k; z' S" ^6 `4 H( \x 4 6
$ h6 @1 I- R! j9 `/ c7 P" y: D/ }7 5 8+ ` ^6 l5 P/ B& H& B$ e$ z
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
1 [* y$ C1 X% a' C1 Y% J% k% T+ t7 k/ t' E+ g
1 2 3& u$ b0 w8 n/ d( S3 y
4 5 6+ P6 {& @7 S- C4 R- X0 e3 G1 p
7 8 x0 N2 H; d1 l$ h- Y+ X q$ v/ I
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下3 a4 p6 }0 y, Q4 t1 w: o
) b! }0 U, M x g
1 2 3 1 2 3 1 2 3 1 2 3
7 o* r3 q) l2 _& R$ {$ ?$ g+ Tx 4 6 4 x 6 4 5 6 4 5 62 e% `/ G8 L3 v
7 5 8 7 5 8 7 x 8 7 8 x* G6 |9 V0 T1 {2 w9 }" G
把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
% k. K) D8 K9 V, e5 N, M
4 Y; C/ k, L: \; \: a8 A+ p【输入格式】7 U$ w! z# W& l' s, U4 ?3 x' Z/ I
8 _- _% ~3 h+ n. l) q/ u2 h
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:" k, G' @4 c( i5 ^
2 w0 u+ [3 F0 [8 h3 ]1 2 3
: N* b( _; L) f" C$ X% K( m/ yx 4 6 , d1 j6 k+ q2 i/ U- j# k
7 5 8
! d0 Y% e# N C& R 则输入为:1 2 3 x 4 6 7 5 8* x6 [# O. o6 `0 [( U) y x- D
$ G/ l: f5 }1 a# g* M! E【输出格式】
: w: M0 j- m9 k% {: C; M( `- e& g; F0 I; x5 r% j0 X
输出占一行,包含一个整数,表示最少交换次数。
7 E( i% ^7 I; F( j2 v0 q7 F1 B7 v# O$ M3 u5 S. g5 c: Y( ^7 l1 O
如果不存在解决方案,则输出 −1。4 ~4 L3 }% [! C+ A5 U& r. f& M
2 ]" J7 Z1 w+ ^4 l3 F( o
【输入样例】6 p; v9 p* A9 K" B4 n) ~
, w3 ? N9 c' ]- j
2 3 4 1 5 x 7 6 8
6 z2 E: l# r5 Z) z8 {& k7 j) j7 k【输出样例】
3 F5 J/ @- s3 x3 `
% ]! Q0 Q( r6 c6 J3 U* t19
5 D% F/ o6 @# B1 t+ w2 K【解题思路】
' M+ o% w: x+ @ g
6 d: ~* _: G5 q* F+ O 简答题,用BFS遍历查找即可。! |' S) c- h( {
: ]+ N" k5 }: ]
【Python程序代码】
" _: e% n/ }5 g& Z! d n1 o1 e" D: [4 k' I X
from collections import */ d- I; L& T4 M' _7 }1 h, d( m; U
pd = ['0','1','2','3','4','5','6','7','8','x']: o+ ~: B& u% v9 k5 A( h% {: A
norm = "".join(pd)" ^+ ~' f/ E+ s# S7 e# ]: q! c
dir = [1,-1,3,-3]* \8 X( d) f2 O% k+ V! Z5 q
s = ['0'] + list(map(str,input().split()))( y, d8 l- D' Z/ A; i3 k4 w V
idx = s.index('x'): p) z6 S% D9 q; Y: w! x. F# Z
mp = defaultdict(int)6 j Q& t4 @$ \/ h
def bfs():
2 X) R* m7 a6 U5 } q = deque()
; o8 `$ Q' O9 `- } step = 0, i% a4 Q9 O8 l- A, {
q.append( [s,idx,step] )* V6 B! B4 j! @$ t5 m! r: s; M* |
ns = "".join(s)
( {2 A6 S j* O mp[ns]=1
6 h! L. ~& ~$ K* c flag,res = 0,-18 L$ O4 b% l% m, n' u5 K
while q:# D/ Y1 V% Q, U
ss,sidx,step = q.popleft(); B9 C- O Z) ^/ G! q# M
if "".join(ss)==norm:
0 z9 O) p0 N- s k* I3 Y! Y, e res = step
, V& v! z: b; M# l2 }5 o1 u" Q break
9 ~& |" a5 ~/ I1 Z, B# C for i in dir:
9 L/ ?: q# e: h |( v teps = ss.copy()
7 L# w: R8 {( r/ F+ y4 h# z, z nidx = sidx + i
! {- L i9 n6 {( j4 e E if nidx<1 or nidx>9:continue7 f/ ?" _- y. o8 E- v4 }1 s
if (sidx==3 or sidx==6) and i==1:continue c" K; a% R" B* ?" F) \+ H( w
if (sidx==4 or sidx==7) and i==-1:continue
: u9 C8 n1 S( f5 x& D: a teps[sidx],teps[nidx] = teps[nidx], teps[sidx]: S+ d) r: I8 s& K) @& r+ h
nteps = "".join(teps)
& g/ j9 C2 n, Z1 S8 {' N if mp[nteps]:continue, N- [: u) X1 T# u" f0 `' D8 t2 F
mp[nteps]=15 N4 g5 o( h1 ]6 {
q.append( [teps,nidx,step+1] )
* F- {' P, l9 k( u% d print(res)
' |) r9 u2 v& A( Y9 o. Ibfs()
% c0 |7 X& i! ]9 [4 ~7 c! h
+ a/ Q3 C. r5 ?1 S+ S" j8 K# U$ U1 M$ ?+ K5 \
" Y, h# O S) |* |* b0 k
# v- d! C+ X6 R( B0 x0 v' J$ Q0 p7 Z9 D6 }+ e1 N9 I3 ~: M
|
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|