魔板 BFS python实现

问题描述

在魔方风靡全球之后不久,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值