GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2031|回复: 15
收起左侧

[技术交流] 【Python】【原创】魔方群置换与生成元

[复制链接] |关注本帖

邪恶的面具海盗弯钩神秘的红茶冒险用绷带魔法石碑箭术卷轴质量效应三部曲

     楼主| 白冥 发表于 2025-2-26 19:02:40 | 显示全部楼层 |阅读模式 <
    本帖最后由 白冥 于 2025-2-26 19:58 编辑


    目录      
    • 概述
    • 核心功能
    • 类结构与方法
    • Cube 类(小立方体类)
    • MagicCube 类(魔方类)
    • 原理
    • 算法复杂度
    • 使用示例



    概述      

            本帖实现了一个3x3魔方的抽象模型,通过面向对象的方式模拟魔方的立方体块(Cube)和整体结构(MagicCube)。核心目标是为魔方状态跟踪、旋转操作及算法研究提供基础框架。本帖代码均由本人写就。


    核心功能      
    • 支持六种基础面旋转(U/F/R/L/B/D)
    • 自动维护立方体块的邻接关系
    • 实时跟踪各块的面归属状态
    • 提供可扩展的置换规则接口


    类结构与方法      
            Cube 类
                ├ __init__ 构造方法
                ├ _set_group 私有方法
                ├ binding 方法
                ├ get_group 方法
                ├ observe 方法
                └ group_permutation 方法
            MagicCube 类
                ├ __init__ 构造方法
                ├ _build_cube 私有方法
                ├ get_magic_cube 方法
                ├ face 方法
                ├ _group_permutation 私有方法
                ├ U 方法
                ├ F 方法
                ├ R 方法
                ├ L 方法
                ├ B 方法
                └ D 方法


    Cube 类(小立方体类)      
            表示单个立方体块,负责维护自身状态和相邻块关系。
    1. class Cube:
    2.     def __init__(self, x: int, y: int, z: int):
    3.         if not (-1 <= x <= 1 and -1 <= y <=1 and -1 <= z <= 1):
    4.             raise ValueError("超出范围")
    5.         self._group = self._set_group(x,y,z)
    6.         self._permutation_matrix = [
    7.             [0, 2, 4, 1, 3, 5],
    8.             [3, 1, 0, 5, 4, 2],
    9.             [1, 5, 2, 3, 0, 4],
    10.             [4, 0, 2, 3, 5, 1],
    11.             [2, 1, 5, 0, 4, 3],
    12.             [0, 3, 1, 4, 2, 5]
    13.         ]
    14.         self._bind=None
    15.         self._cube_group=None
    16.     def _set_group(self,x,y,z):
    17.         faces = [z == 1, x == 1, y == 1, y == -1, x == -1, z == -1]
    18.         return [(idx if faces[idx] else None) for idx in range(6)]
    19.     def binding(self, bind):
    20.         if self._bind is not None:
    21.             raise ValueError("重复操作")
    22.         self._bind=bind
    23.     def get_group(self):
    24.         return self._group
    25.     def observe(self, permutation):
    26.         next = self._bind[permutation]
    27.         group = next.get_group()
    28.         self._cube_group = group[:]
    29.     def group_permutation(self, permutation):
    30.         pg = self._permutation_matrix[permutation]
    31.         self._group = [self._cube_group[next] for next in pg]
    复制代码

            关键方法:
            binding(self, bind):
            功能:绑定扭转面的块
            observe(self, permutation):
            功能:根据生成元信息获取绑定块的属性
            group_permutation(self, permutation):
            功能:群置换
    MagicCube 类(魔方类)      
            
    1. class MagicCube:
    2.     def __init__(self):
    3.         self._cube = self._build_cube()
    4.     def _build_cube(self):
    5.         cubes = {(x, y, z): Cube(x, y, z) for x in [-1, 0, 1] for y in [-1, 0, 1] for z in [-1, 0, 1]}
    6.         for crood, cube in cubes.items():
    7.             x, y, z = crood
    8.             bind = [cubes[(-y,x,1)], cubes[(1,-z,y)], cubes[(z,1,-x)], cubes[(-z,-1,x)], cubes[(-1,z,-y)], cubes[(y,-x,-1)]]
    9.             cube.binding(bind)
    10.     def get_magic_cube(self):
    11.         return self._cube
    12.     def face(self, permutation):
    13.         cubes = []
    14.         for crood, cube in self._cube.items():
    15.             x, y, z = crood
    16.             faces = [z == 1, x == 1, y == 1, y == -1, x == -1, z == -1]
    17.             if faces[permutation]:
    18.                 cubes.append(cube)
    19.         return cubes
    20.    
    21.     def _group_permutation(self, permutation):
    22.         cubes = self.face(permutation)
    23.         for cube in cubes:
    24.             cube.observe(permutation)
    25.         for cube in cubes:
    26.             cube.group_permutation(permutation)
    27.    
    28.     def U(self):
    29.         self._group_permutation(0)
    30.     def F(self):
    31.         self._group_permutation(1)
    32.     def R(self):
    33.         self._group_permutation(2)
    34.     def L(self):
    35.         self._group_permutation(3)
    36.     def B(self):
    37.         self._group_permutation(4)
    38.     def D(self):
    39.         self._group_permutation(5)
    复制代码


            关键方法:
            _group_permutation(self, permutation):
            功能:
                1、收集目标面所有块
                2、通知每个块使用的生成元
                3、群置换
            U/F/R/L/B/D(self):
            功能:扭转上/前/右/左/后/下面,充当魔方置换循环群的生成元


    原理      
            根据笛卡尔坐标系的旋转变换,绑定变换与扭转变换反向,以块(1,1,-1)的F操作为例:
            原始坐标:(x=1, y=1, z=-1)
            F旋转(绕X轴顺时针转90°)后的新坐标:(1,1,-1) → (1,1,1)
            则(1,1,1)块继承(1,1,-1)块的状态


    算法复杂度      
            时间复杂度:每次面扭转后仅影响4个边块和4个角块,总体时间复杂度为O(1)
            空间复杂度:存储27个Cube对象,每个包含6个绑定,总内存消耗约27*6=162个整型索引


    使用示例      
            
    1. if __name__=="__main__":
    2.     magic_cube = MagicCube()
    3.     cubes = magic_cube.get_magic_cube()
    4.    
    5.     # U操作
    6.     print(cubes[(1,1,1)].get_group())
    7.         ###输出:
    8.         #[0, 1, 2, None, None, None]
    9.         # 上:上,前:前,右:右
    10.     magic_cube.U()
    11.     print(cubes[(1,1,1)].get_group())
    12.         ###输出:
    13.         #[0, 2, 4, None, None, None]
    14.         # 上:上,前:右,右:后
    15.    
    16.     # 组合操作(FRU操作)
    17.     magic_cube.F().R().U()
    18.     print(cubes[(1,1,1)].get_group())
    19.         ###输出:
    20.         #[2, 0, 1, None, None, None]
    21.         # 上:右,前:上,右:前
    22.    
    23.     # U'操作
    24.     magic_cube.U().U().U()
    25.     print(cubes[(1,1,1)].get_group())
    26.         ###输出:
    27.         #[2, 4, 0, None, None, None]
    28.         # 上:右,前:后,右:上
    29.    
    复制代码




    评分

    参与人数 5血液 +2 追随 +4 堕落 +2 收起 理由
    zhuovboyan + 2
    找乐子企鹅仔 + 1 + 1
    让阳光转个弯 + 1 + 1
    遥接秦霞 + 1
    百变小阴 + 1

    查看全部评分

    回复

    使用道具 举报

    漂洋小船丹尼爾·紐曼肉乖乖

      百变小阴 发表于 2025-2-26 19:25:43 | 显示全部楼层 <
      不明觉厉帮忙点追随了
      说实话我完全没看懂这代码是什么...反正应该不是我知道的那个魔方就是了
      回复

      举报

      裸体克里斯位于左侧的随从已派遣远征自定义男从Homunculus虚空之海的鲸永浴爱河黄粱一梦【新春限定】果体 隆『召唤好运的角笛』永远的克叔業火死鬥

        娱乐法师火布偶 发表于 2025-2-26 19:57:37 | 显示全部楼层 <
        回复

        举报

        自定义男从Homunculus岛田半藏托比·马奎尔璀璨闪蝶闪耀的赫尔墨斯之杖【新手友好】昆進生锈的海盗刀枪

          ddbGameMale 发表于 2025-2-26 19:59:38 | 显示全部楼层 <
          回复

          举报

          黄色就是俏皮裸体克里斯上作剧情『逆境中的幸运女神』幸运女神的微笑近地夜航魔法石碑

            遥接秦霞 发表于 2025-2-26 20:11:15 | 显示全部楼层 <
            我的妈大佬啊,本可学的软件工程,写的孱弱代码上不了台面,算法也蒟蒻,我们离散数学学得也很浅,完全想不到这个关于魔方解和群论的关联,而且时间复杂度居然是O1,自己玩魔方都是套公式,难怪世界级的魔方竞赛可以那么快
              收起(4)
            回复

            举报

            森林鹿邦尼尼熔岩鹰不曾寄出的信件格拉迪欧拉斯小丑与格雷与星光璀璨御医神兔月光骑士最终幻想XVI

              随心110 发表于 2025-2-26 21:22:35 | 显示全部楼层 <
              这素什么?不明觉厉。感觉是用软件内的魔方模型的代码?很有才华惹~赞赞~~~
              回复

              举报

                i2205909 发表于 2025-2-26 22:28:26 | 显示全部楼层 <
                回复

                举报

                奧倫位于左侧的随从已派遣远征灵魂残絮聚合法神奇宝贝大师球Beauty and the Beast肉乖乖吃饱金币的Doge猫咪点唱机

                  zibatco2 发表于 2025-2-26 22:51:23 | 显示全部楼层 <
                  实在素有点深奥完全看不懂, 但这个是可以延伸应用在哪方面嘛....
                  回复

                  举报

                  永亘环堕落之舞『道具超市』驯化黑龙幼崽牧羊人红心玉

                    锦书致南辞 发表于 2025-2-26 23:03:43 | 显示全部楼层 <
                    回复

                    举报

                      zzz171962736 发表于 2025-2-26 23:38:11 | 显示全部楼层 <
                      回复

                      举报

                      艾吉奥位于左侧的随从已派遣远征诺曼底号

                        万俟 发表于 2025-2-27 15:11:59 | 显示全部楼层 <
                        这个感觉快到我的领域了,楼主用这个计算什么吗?比如正规子群或者不可约表示?
                          收起(5)
                        回复

                        举报

                        超人位于左侧的随从已派遣远征和你一起飞行的皮卡丘GHOST光子之海成年独角兽『搓粉团珠』神奇宝贝大师球肉乖乖

                          找乐子企鹅仔 发表于 2025-2-28 11:15:19 | 显示全部楼层 <
                          偶尔拧魔方的咱自信满满点进来,看到代码留下追随屁滚尿流抬出去இ௰இ
                          回复

                          举报

                          神奇宝贝大师球神奇宝贝图鉴『搓粉团珠』雪王的心脏肉垫手套『落樱缤纷』里昂‧S‧甘乃迪小小安全帽丹雀衔五穗,人间始丰登『随时随地开启!』

                            zhuovboyan 发表于 2025-3-6 05:24:39 | 显示全部楼层 <
                            回复

                            举报

                            邪恶圣杯百相千面-戏Futūrum(未来)岛田半藏诺克提斯·路西斯·伽拉姆铁汉柔情岛田源氏BIG BOSS康纳/Connor普隆普特·阿金塔姆

                              2302594 发表于 2025-3-7 06:33:57 | 显示全部楼层 <
                              回复

                              举报

                              您需要登录后才可以回帖 登录 | 立即注册

                              本版积分规则

                              文字版|手机版|小黑屋|GameMale

                              GMT+8, 2025-4-30 21:55 , Processed in 0.120269 second(s), 107 queries , Redis On.

                              Copyright © 2013-2025 GameMale

                              All Rights Reserved.

                              快速回复 返回列表