'''
问题 B: 魔板
利用队列实现宽度优先搜索(BFS)
'''
import sys
from queue import Queue
def A(s):
a = s[:4]
b = s[4:]
return b + a
def B(s):
a = s[3]
b = s[7]
s1 = s[:3]
s2 = s[4:7]
return a + s1 + b + s2
def C(s):
a, b, c, d, e, f, g, h = s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]
return a + f + b + d + e + g + c + h
def bfs(): # 主要是理解先进先出队列机制在该题中的巧妙运用
global flag, result, init
q.put(init)
case.setdefault(init, 0)
while not q.empty():
t = q.get() # 获取当前队列第一个值
m = [0 for i in range(3)] # 用于存放三种状态变换后的值
m[0] = A(t)
m[1] = B(t)
m[2] = C(t)
for i in range(3):
if m[i] not in case:
case[m[i]] = case[t] + 1 # case键为变换后的字符串,值为第几次变换
pre[m[i]] = [chr(ord('A') + i), t] # t标示上一节点,以此来追踪找回操作顺序
q.put(m[i])
if m[i] == result:
return case[result]
q = Queue()
init = '12348765'
fo = list(map(str, sys.stdin.readline().split()))
# 对结果字符串进行变换
result = ''
for i in range(len(fo)):
result += fo[i]
a = result[:-5:-1]
b = result[:4]
result = b + a
case = {} # 以字典形式存放每次操作变换后的字符串(键)和变换次数(值)
pre = {} # 以字典形式存放每次操作变换后的字符串(键)和 [变换操作的名称,变换前的字符串] (值-列表形式)
bfs()
biu = case[result]
print(biu)
mm = [0 for i in range(biu)]
a = pre[result][0]
mm[-1] = a
b = pre[result][1]
for i in range(1, biu):
c = pre[b][0]
mm[biu - i - 1] = c
b = pre[b][1]
for i in range(biu):
if i != biu - 1:
print(mm[i], end='')
else:
print(mm[i])
魔板(BFS——python实现)
最新推荐文章于 2024-02-17 23:11:45 发布