- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】
! F; N8 q- k! z. ~2 j% U! x* y. b2 P( _6 V8 S: v) x
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
5 r: x0 w4 F0 O, d* d% u8 l7 o* r3 @$ {! d& R' `
例如:
. {4 U+ v7 \; R1 v$ o6 s: |$ c- Y7 \% ^6 C B7 m' Z! ?8 h! B: {
1 2 3
N4 f* i3 j5 d1 l0 f8 k9 nx 4 6
/ ?8 \ A( Y, X7 5 8+ w5 g5 g9 V1 H7 v
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
! @1 [* X- L5 u3 z' E% J4 }9 z; s1 U
1 2 33 e' B% G$ C# v6 g
4 5 6
, {$ e4 e9 D0 {. A- b; f3 C# k7 8 x3 V4 ]2 v w( |9 n8 p. I& J
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下
+ ? r5 F$ M( r$ s" Q5 p, w
# m3 r. i. S! {9 [ {1 2 3 1 2 3 1 2 3 1 2 3
6 E0 o5 d! a& j- _' J: C% Ox 4 6 4 x 6 4 5 6 4 5 6
5 A# v' ]; s/ h! o8 r7 5 8 7 5 8 7 x 8 7 8 x
% z' q7 I8 W7 |) q0 i2 ]/ E) p 把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。. [/ B- b) g# R- y& |% H$ D8 O
6 h0 K2 b9 y* y' m4 a8 X【输入格式】
$ X0 D# x5 B/ p9 s/ c/ y( s, O \. N/ y& @. z/ E+ [; P
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:6 w' @: V2 y5 _4 _
4 }( ~! ~( c! Y3 }8 _; r
1 2 3 ' l' p) E- a) i
x 4 6 9 S" f- r3 k- ]3 O* S+ M
7 5 8
6 f1 `+ t; p0 v, [: n( b1 [ 则输入为:1 2 3 x 4 6 7 5 8
2 ~2 o: L+ Y% ]8 h9 `. _) P7 h, U, ]
【输出格式】
; p& ]) W( Z+ b5 @6 Z+ @* R' l$ l7 A0 l7 A9 P' n6 k
输出占一行,包含一个整数,表示最少交换次数。
! p. o* q& Y- u! o7 `7 z) }
& s. u0 y' s- I9 G+ B" g7 \ 如果不存在解决方案,则输出 −1。 r; N1 g% Y+ w7 g( O
0 [0 ]+ N( K# K2 ~5 ]/ N2 L0 [【输入样例】2 F8 C5 T; U2 c
4 W; g1 t; g$ y* G: X/ K2 3 4 1 5 x 7 6 8% c. D" N* T2 N* L
【输出样例】) C# |1 Q$ R# I' d5 I( l O3 m
1 `! b7 Z2 O; B19
; `3 b( \7 q: _, p【解题思路】
& }4 y" o+ M0 t" b6 n6 t' U. H. S9 I
简答题,用BFS遍历查找即可。0 [+ ^8 E# b) g
- p4 [- `+ S1 X7 s3 d【Python程序代码】$ ]1 E1 |! G; c g- B* q
4 l- x; e: ?7 Q& m: [% X( Lfrom collections import *9 O% o1 F) s$ c3 L( c
pd = ['0','1','2','3','4','5','6','7','8','x']: x* _- f8 N. W0 F5 L: O, e b
norm = "".join(pd)$ X1 K: v3 l/ S- T
dir = [1,-1,3,-3], z: w0 W2 k9 U
s = ['0'] + list(map(str,input().split()))7 `2 H( g4 Z1 s, u
idx = s.index('x'). s+ C! C! U7 h: _, G! i- j
mp = defaultdict(int)
* o' f" N. H4 M* P5 tdef bfs():1 _- e! y* `" m
q = deque()
' ^ @8 }- K" K: q step = 0
@4 U6 P/ V/ y, ] q.append( [s,idx,step] )
4 K( s( Q [0 f% _: u ns = "".join(s)
( a' r: d9 P1 c8 N& J6 F$ y- K mp[ns]=1
4 B( |! R" y% o( Y+ N- Y& l! f flag,res = 0,-1% `( {& b' I) _; [
while q:
, @+ e. }/ E: W0 ~' S+ [ ss,sidx,step = q.popleft()' { b" U* J! {+ t6 q. T$ r& u1 K
if "".join(ss)==norm:
) R8 W5 F% t5 P4 h- b& h res = step, W% v& o% _1 x4 y
break
; H6 r# o p& s# t1 T for i in dir:
* w. s: O# ]" M8 Z teps = ss.copy()$ g8 a- x* N, a
nidx = sidx + i
+ r( \$ D: c0 y$ K* W0 { if nidx<1 or nidx>9:continue
6 d/ j& s4 X9 E$ p- n- w, J if (sidx==3 or sidx==6) and i==1:continue
! |6 i2 t' N9 E6 ~ if (sidx==4 or sidx==7) and i==-1:continue; P5 P( _( D& r8 R
teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
0 n2 y' w0 g! b# T a" P) c nteps = "".join(teps)
5 I! c$ B1 H" K6 m- N if mp[nteps]:continue
7 ^1 E- H* |5 L; D mp[nteps]=1
+ }( L5 L5 ~4 I3 a7 h$ w3 f% J q.append( [teps,nidx,step+1] )
& J! M. y4 K# y5 {2 E. Y! |3 o print(res)
x& x1 O7 ?9 L6 i( ?4 L7 R& v0 ~bfs()
4 k6 S& G9 O4 p" _5 s* C9 d5 L4 d& x" ?
6 e5 W# B% r& [) ^9 W9 I
, \2 ~' c7 a$ c- l. O7 t
9 ^3 @- e2 ?: ]) \% n- Q
$ o. A; z& o& [/ c |
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|