- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
题目描述】9 b9 f, ?8 T& V6 P" B9 _# Y
9 g( @) e# `, M1 Q4 Q
在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
- U' R! A, s3 d d- U" {7 q" N$ C+ l: O! R' g! B) ^5 |
例如:$ ` u9 b M; g4 ?5 R
7 t3 r9 `7 h! A; k1 E
1 2 3
! F( @* {7 z, D! P+ sx 4 6/ i7 }! d& ^5 H* I: t% o
7 5 8/ A' F' _; R0 }- c& R
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):
0 Q* E. x0 z# c2 m; `% z X- b5 W! V
1 2 3' I. I( |5 \3 I* O, B+ h" B/ X
4 5 62 E" O5 o) D8 ]# n0 j! T0 n
7 8 x$ {( t# |: d3 _
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下! Z1 T D. x! S4 ^
* y0 n2 b0 {4 }$ \! ] A5 M1 2 3 1 2 3 1 2 3 1 2 34 q, d; ?8 a: `3 A
x 4 6 4 x 6 4 5 6 4 5 6! } i6 k* e8 N' S/ V0 m% x0 r
7 5 8 7 5 8 7 x 8 7 8 x
% L& u0 z: |8 Q 把 x 与上下左右方向数字交换的行动记录为 u、d、l、r。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。6 G: H- f- f% `5 q5 d- v' r3 Y& \
# g* \, u4 ^! D( n【输入格式】4 L) {+ N& L7 q
6 }) N1 Y+ w1 p& E
输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:
4 Q6 H1 g# g% }! u- o9 G) `1 p5 E/ c0 X; q* P7 n: X# W9 F
1 2 3
; q b: }1 J: y1 [' n9 Px 4 6
J; q! y7 H' Y# S7 5 8 6 G8 e# ~& ?2 s# n! g/ O# F
则输入为:1 2 3 x 4 6 7 5 8
; O: D, {2 @- V% f; z, u6 m
* B. a) b6 B0 J5 Y- c【输出格式】1 d1 v- e6 u4 i9 g. S* w( k
7 {& ^# ]) ^# ?& ]; W0 L/ U 输出占一行,包含一个整数,表示最少交换次数。/ t' U( h! }! u- f
' P( e* b& w$ D3 @& r$ i- n5 @$ C3 o 如果不存在解决方案,则输出 −1。1 p9 W/ g4 H7 F, Z7 L
6 y, l3 E5 S- U# w/ X% }& G
【输入样例】9 d. f* ], ^' k7 L% B! z
8 k$ L3 I9 e7 T% L2 R# m
2 3 4 1 5 x 7 6 8( F+ X# v; r! @
【输出样例】; ]! r q6 t9 |& e1 s$ g5 I, f0 y
2 t5 }% d) f9 z. n9 e' F/ V19- |6 T" b4 }9 x1 P% J s1 p
【解题思路】
8 M2 _6 C# h) {: q2 f6 t: x1 c' g/ P- m4 B1 C6 a
简答题,用BFS遍历查找即可。
& W" ^8 e' [6 {1 D) J' \
: |2 r' a8 j, \【Python程序代码】6 W' F* R9 C2 }2 f. o( ^
; p8 Y; R* A' \$ M( j; Y/ K! ?
from collections import *
! h, f, |( r. B& q( s {. spd = ['0','1','2','3','4','5','6','7','8','x']% p4 w5 l$ t) w% o0 W9 D
norm = "".join(pd)
2 s1 Z1 c6 F. D" Vdir = [1,-1,3,-3]
. @' i/ V! H" w& is = ['0'] + list(map(str,input().split()))
c' V: r* t# E0 ~4 tidx = s.index('x')
8 k" u* }( s/ j; a- u2 tmp = defaultdict(int)
2 m2 U* B- ~& A3 g* J; jdef bfs():
, e0 i# I# T3 t q = deque()0 f( }4 C2 g; J0 t
step = 0
: X/ P- \' W: [' B M8 p q.append( [s,idx,step] )$ M' ]( J4 }# i! }6 n' e T
ns = "".join(s)
; I& n i7 {( x' L9 G mp[ns]=1
% V) G- F) K7 x# C2 S4 S; I5 G flag,res = 0,-1! M2 X/ p4 H% ~$ U9 H0 u
while q:% L2 q! \$ B& I, p4 Y
ss,sidx,step = q.popleft() T5 i- y" X2 N% W8 `1 n
if "".join(ss)==norm:
9 w' `; A4 V# B' } res = step
/ X4 P! T; y0 l1 O- k7 g' y( M break
) ]8 K2 o: R& X; ^2 @/ T; t for i in dir:
0 [; X1 l. @. [2 L teps = ss.copy()
4 a# S1 P6 j/ O+ k( h( K nidx = sidx + i
! |1 }! _- x9 @- t if nidx<1 or nidx>9:continue
% Z: x# T F9 |% W$ g W if (sidx==3 or sidx==6) and i==1:continue
' z9 y1 J5 d" @- }: ~: b if (sidx==4 or sidx==7) and i==-1:continue) V/ n& R9 n6 J/ e, }
teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
" ]6 z$ ^, o8 |( D nteps = "".join(teps)
2 j& f" b7 k. M4 F7 |: | W7 O if mp[nteps]:continue% V, v: c5 @! y0 D! [+ n* u$ L5 q
mp[nteps]=11 Q3 V+ l1 e* }1 n) J* e7 V
q.append( [teps,nidx,step+1] )
( s: k: D* `0 K- \ print(res) R7 q, q& t$ @7 d% O( _) ], g T
bfs()
4 V3 n6 r/ `- G( D0 c; _9 E3 Z) h7 d$ a/ t
/ C) p9 T: P# Z5 H- _
6 l9 _& I# T) o2 }$ e$ H* h. H) R! L, M: p& W
5 x) m% S# [3 F+ Y2 Z+ c# I# g' [
|
-
-
代码.txt
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 2 点体力 [记录]
[购买]
zan
|