- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】, X! O& B4 R7 u/ ~
* P- d. Q8 k# _* Z" `' [1 |) M& G
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
% [7 a8 k' c( ?, t2 U: M8 Z/ {- m4 c7 g/ t8 m
例如:
. g" |0 u' n! o W8 Q4 p4 j9 I0 B( N5 z) C& b
1 2 3
+ W( d; Y6 L+ U. T# d- [$ k' l9 |9 fx 4 67 J% F5 h; X3 G
7 5 8
. d$ Y1 a. p- c8 t0 J7 R 在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):6 C. \, |! r0 I: H
6 w A5 G( }+ h- M+ y+ R" A) Z
1 2 3- u% Q7 \+ c% f9 Y
4 5 6
. Z: S3 v) P3 b# w& J% C7 8 x' ^' [; R" j3 b0 ~/ K: ?
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下/ C: e1 g8 y9 M" E- j+ | _4 z8 Z
0 y, [) G% J1 w% A6 y' z4 u/ K' E( p
1 2 3 1 2 3 1 2 3 1 2 32 Y! t) Y* l0 T% s2 K5 x8 a
x 4 6 4 x 6 4 5 6 4 5 6$ |% i: F' U$ f. {
7 5 8 7 5 8 7 x 8 7 8 x6 G. F& |! z- _) ? I
把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。
R$ ~4 U: c* t0 k7 w
: s6 G6 o* e, G, p$ T2 S9 C【输入格式】* s+ R; m- i/ B$ s
8 X3 H0 v7 n6 d* ^ 输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:
( I7 X4 f+ i0 _& F* Y
7 Q! K4 x' ]) C. _% i% v: M* ^1 2 3 8 f% f8 ^& @& ^- u$ g3 J% O) t- [
x 4 6 # ]9 A; @, y7 J& I3 d ~
7 5 8 , V# t! |8 L7 u; d7 q5 R
则输入为:1 2 3 x 4 6 7 5 8
8 N9 g) A# c- J7 A- j2 Y: F4 F$ _7 Z S- B* H- |) E. X3 t
【输出格式】& W" {# _. S' A% U. e
" ]7 e2 k! L' L* y& v; ~ 输出占一行,包含一个整数,表示最少交换次数。
) t" K0 y) _& @% A7 y* f$ y/ d+ v# v) |+ v% P1 |
如果不存在解决方案,则输出 −1。
" ^( D) C ?- a: J% Q/ |& \( a
【输入样例】/ x- x" G, [' S% A' @
9 k" e; S+ a- b, }" U# F* ]3 ?9 ^
2 3 4 1 5 x 7 6 8
, J2 f9 N8 y$ f* e$ r4 o* M【输出样例】: r( _5 b! v- |9 K
+ m& G' Q0 H8 z" }
19' q% _# F" N. g" k4 C
【解题思路】) C% M$ E, Z1 {9 f
! U+ z/ E- j" h4 S }# | K 简答题,用BFS遍历查找即可。: ^2 s! _, z# d' g# ^: P) ~
' M `$ q ]0 F1 F6 X- q$ @
【Python程序代码】7 ^+ z- E( W' i
8 M+ M7 |% @4 d; d7 efrom collections import *% s/ a6 _4 y# N
pd = ['0','1','2','3','4','5','6','7','8','x']
" F( a' ~8 W# J. fnorm = "".join(pd), g. S( I" e4 j9 f4 x
dir = [1,-1,3,-3]6 _) r( B1 M: r: T# O0 ~
s = ['0'] + list(map(str,input().split()))1 Z% f9 t+ W$ G9 b
idx = s.index('x'). d, m7 |- A& e- y1 m
mp = defaultdict(int)/ F, g3 T$ p: k8 ^
def bfs():
$ ]6 ~' v5 _; c8 K; b$ o q = deque()1 [3 k/ }4 o/ A9 P% c; G- _
step = 0& B& o% T1 u7 M- i( K5 r: a
q.append( [s,idx,step] )% U/ S3 n' e9 q @
ns = "".join(s)0 c g1 v% W; I, ] B% n
mp[ns]=1* }0 U) u3 `( `+ u" w! N# Q6 p
flag,res = 0,-1
; o0 M' u' }. l while q:) Y9 X; X, m' q1 z
ss,sidx,step = q.popleft()5 E8 i% s1 E8 `4 V% h6 T
if "".join(ss)==norm:1 q: L, V# l% B% R7 e2 E, _! s- Y
res = step* A1 w; @, ]* ~4 q. C. J, K. S
break0 j+ @7 @6 } z3 Z0 f6 S( |" z
for i in dir:
/ D$ c2 J4 v! q( H5 k teps = ss.copy()- Y3 A$ `+ X2 _! p; P
nidx = sidx + i/ q9 z! R$ q1 z! P
if nidx<1 or nidx>9:continue
* Y0 ~8 {# I/ F/ ] if (sidx==3 or sidx==6) and i==1:continue) T4 }" T8 I& |# A+ u" G
if (sidx==4 or sidx==7) and i==-1:continue$ d2 F3 u. o: a- I0 ]
teps[sidx],teps[nidx] = teps[nidx], teps[sidx]/ i0 A* |$ i: F( g' v5 A4 h& o
nteps = "".join(teps)
2 {, L e- T' g$ a7 J; W if mp[nteps]:continue
w% ]/ Z4 {- N) ]4 F mp[nteps]=1
1 ^- Q- J$ J0 p7 ~! X& c- }) b5 t0 p q.append( [teps,nidx,step+1] )
8 @1 A0 u1 g6 s5 s print(res)
7 R- T; a+ r2 G9 d% u4 j% nbfs() P* v7 A9 ^. V; Z" s
+ ~8 Y7 g' H+ V) ?+ A; U' X( Z. c- V4 n' q
( p2 M5 Y. I4 C( M3 M
" y* k3 r& ^" x, L: S \; Y2 W1 g( A
+ R+ x# \* n% v% {$ P, H5 I |
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|