问题描述
在魔方风靡全球之后不久,Rubik先生发明了它的简化版――魔板。魔板 由8
个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任
一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时
针方 向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的
状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步
骤,若有多种变换方案则取字典序最小的那种。
输入
每组测试数据包括两行,分别代表魔板的初态与目态。
输出
对每组测试数据输出满足题意的变换步骤。
输入例子
12345678
17245368
12345678
82754631
输出例子
C
AC
代码实现
class Node:
def __init__(self, value, rec):
self.value = value
self.rec = rec
def __str__(self):
return self.value
def fun_a(rectangle):
result = rectangle[::-1]
return result
def fun_b(rectangle):
result = ""
result += rectangle[3]
result += rectangle[0]
result += rectangle[1]
result += rectangle[2]
result += rectangle[5]
result += rectangle[6]
result += rectangle[7]
result += rectangle[4]
return result
def fun_c(rectangle):
result = ""
result += rectangle[0]
result += rectangle[6]
result += rectangle[1]
result += rectangle[3]
result += rectangle[4]
result += rectangle[2]
result += rectangle[5]
result += rectangle[7]
return result
if __name__ == '__main__':
try:
while True:
root_rec = input()
root = Node("", root_rec)
end = input()
visited = set()
visited.add(root_rec)
queue = [root]
while len(queue) != 0:
node = queue[0]
queue.pop(0)
if node.rec == end:
print(node)
break
else:
if fun_a(node.rec) not in visited:
visited.add(fun_a(node.rec))
node_a = Node(node.value + "A", fun_a(node.rec))
queue.append(node_a)
if fun_b(node.rec) not in visited:
visited.add(fun_b(node.rec))
node_b = Node(node.value + "B", fun_b(node.rec))
queue.append(node_b)
if fun_c(node.rec) not in visited:
visited.add(fun_c(node.rec))
node_c = Node(node.value + "C", fun_c(node.rec))
queue.append(node_c)
except EOFError:
pass