python实现三阶魔方还原的示例代码


Posted in Python onApril 28, 2021

思路

复原魔方困难问题的分解:

​ 1、用合适的数据结构表示出三阶魔方的六个面以及每一面的颜色

​ 2、每一次不同旋转操作的实现

​ 3、复原时如何判断当前魔方应该使用哪一种公式

本次实验实现了前两个操作,具体思路是:

用numpy库中的矩阵将六个面分别表示出来,按上下左右前后的顺序放入列表中。再依据流行公式里的方法编写对每一个面进行旋转操作的函数,调用函数实现魔方的旋转。最后输入指令可得到旋转之后的魔方,以及执行逆序指令后验证魔方还原。

预备知识

矩阵:使用numpy库中的矩阵结构

函数说明:

U: 上面顺时针旋转 90°

D: 底面顺时针旋转 90°

L: 左面顺时针旋转 90°

R: 右面顺时针旋转 90°

F: 正面顺时针旋转 90°

B: 背面顺时针旋转 90°

**注:**字母前加上下划线 ‘_' 表示逆时针

代码详解

本次实验将【上、下、左、右、前、后】六个面用数字【0、1、2、3、4、5】表示原本每个面的颜色,并依次存入列表faces【】里(即:faces[0]中存放的是最上面的数字全为0的三阶矩阵)

注:魔方视角始终固定,即在整个过程中正(左…)面始终是正(左…)面

# 创建六个面,放在faces列表里,顺序为上(0),下(1),左(2),右(3),前(4),后(5)
faces = [np.zeros((3, 3))]

for i in range(1, 6):
    faces.append(np.ones((3, 3)) + faces[i - 1])

python实现三阶魔方还原的示例代码

每一个面的 顺时针逆时针 旋转由函数 clockwise()antiClockwise() 实现

t = np.array([[0, 0, 1],
              [0, 1, 0],
              [1, 0, 0]])

# 该面顺时针旋转 90 度
def clockwise(face):
    face = face.transpose().dot(t)
    return face

# 该面逆时针旋转 90 度
def antiClockwise(face):
    face = face.dot(t).transpose()
    return face

A.transpose() 方法是实现 A 矩阵的转置

A.dot(B) 方法是实现 A乘以矩阵B

通过计算,上述方法可以实现矩阵顺时针或者逆时针旋转的效果

在这里以左面的顺时针旋转 90°为例,其它旋转方式可以类比

def L(FACES):
    FACES[2] = clockwise(FACES[2])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    e[0], f[0], g[0], h[0] = d[0], a[0], b[0], c[0]
    FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h)

1、直接调用函数将左面(第2面)顺时针旋转 90°

FACES[2] = clockwise(FACES[2])

2、这里采用深度复制,使用 cp.deepcopy() 的方法,避免直接使用等号 ‘=' 导致不同的变量指向同一个值。这时,【e、f、g、h】和【a、b、c、d】代表魔方的

【正面、底面顺时针旋转90°、背面逆时针旋转90°、上面顺时针旋转90°】

a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0])

旋转的目的是:

在左面旋转的过程中,左面会影响到其它四个面,但对其它四个面的影响是不同的。例如正面、底面和上面被影响的是第一列,而背面被影响的是第三列。我们为了使各面统一起来,方便数值的改变,我们选择将正、底、上面顺时针旋转90°,将背面逆时针旋转90°。这时,我们只需按顺序交换每一面的第一行,最后再逆时针或顺时针转回来即可。

python实现三阶魔方还原的示例代码

3、按顺序交换:正面第一行传递到底面第一行

​ 上面第一行传递到正面第一行

​ 背面第一行传递到上面第一行

​ 底面第一行传递到背面第一行

e[0], f[0], g[0], h[0] = d[0], a[0], b[0], c[0]

最后再依次根据上述操作逆旋转回去:

FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h)

代码

import numpy as np
import copy as cp

# 创建六个面,放在faces列表里,顺序为上(0),下(1),左(2),右(3),前(4),后(5)
faces = [np.zeros((3, 3))]

for i in range(1, 6):
    faces.append(np.ones((3, 3)) + faces[i - 1])

t = np.array([[0, 0, 1],
              [0, 1, 0],
              [1, 0, 0]])

# 该面顺时针旋转 90 度
def clockwise(face):
    face = face.transpose().dot(t)
    return face

# 该面逆时针旋转 90 度
def antiClockwise(face):
    face = face.dot(t).transpose()
    return face


def U(FACES):
    FACES[0] = clockwise(FACES[0])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3]
    FACES[4][0], FACES[2][0], FACES[5][0], FACES[3][0] = d[0], a[0], b[0], c[0]


def _U(FACES):
    FACES[0] = antiClockwise(FACES[0])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3]
    FACES[4][0], FACES[2][0], FACES[5][0], FACES[3][0] = b[0], c[0], d[0], a[0]


def U2(FACES):
    for i in range(2):
        U(FACES)
    '''
    FACES[0] = clockwise(clockwise(FACES[0]))
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3]
    FACES[4][0], FACES[2][0], FACES[5][0], FACES[3][0] = c[0], d[0], a[0], b[0]
    '''


def D(FACES):
    FACES[1] = clockwise(FACES[1])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3]
    FACES[4][2], FACES[2][2], FACES[5][2], FACES[3][2] = b[2], c[2], d[2], a[2]


def _D(FACES):
    FACES[1] = antiClockwise(FACES[1])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3]
    FACES[4][2], FACES[2][2], FACES[5][2], FACES[3][2] = d[2], a[2], b[2], c[2]


def D2(FACES):
    for i in range(2):
        D(FACES)
    '''
    FACES[1] = clockwise(clockwise(FACES[1]))
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3]
    FACES[4][2], FACES[2][2], FACES[5][2], FACES[3][2] = c[2], d[2], a[2], b[2]
    '''


def L(FACES):
    FACES[2] = clockwise(FACES[2])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    e[0], f[0], g[0], h[0] = d[0], a[0], b[0], c[0]
    FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h)


def _L(FACES):
    FACES[2] = antiClockwise(FACES[2])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    e[0], f[0], g[0], h[0] = b[0], c[0], d[0], a[0]
    FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h)


def L2(FACES):
    for i in range(2):
        L(FACES)


# 上(0),下(1),左(2),右(3),前(4),后(5)
def R(FACES):
    FACES[3] = clockwise(FACES[3])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = antiClockwise(FACES_new[4]), antiClockwise(FACES_new[1]), clockwise(FACES_new[5]), antiClockwise(
        FACES_new[0])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    g[0], f[0], e[0], h[0] = d[0], c[0], b[0], a[0]
    FACES[4], FACES[1], FACES[5], FACES[0] = clockwise(e), clockwise(f), antiClockwise(g), clockwise(h)


def _R(FACES):
    FACES[3] = antiClockwise(FACES[3])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = antiClockwise(FACES_new[4]), antiClockwise(FACES_new[1]), clockwise(FACES_new[5]), antiClockwise(
        FACES_new[0])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    f[0], g[0], h[0], e[0] = a[0], b[0], c[0], d[0]
    FACES[4], FACES[1], FACES[5], FACES[0] = clockwise(e), clockwise(f), antiClockwise(g), clockwise(h)


def R2(FACES):
    for i in range(2):
        R(FACES)


def F(FACES):
    FACES[4] = clockwise(FACES[4])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = clockwise(clockwise(FACES_new[0])), FACES_new[1], antiClockwise(FACES_new[2]), clockwise(FACES_new[3])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    e[0], g[0], f[0], h[0] = c[0], b[0], d[0], a[0]
    FACES[0], FACES[1], FACES[2], FACES[3] = clockwise(clockwise(e)), f, clockwise(g), antiClockwise(h)


def _F(FACES):
    FACES[4] = antiClockwise(FACES[4])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = clockwise(clockwise(FACES_new[0])), FACES_new[1], antiClockwise(FACES_new[2]), clockwise(FACES_new[3])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    g[0], f[0], h[0], e[0] = a[0], c[0], b[0], d[0]
    FACES[0], FACES[1], FACES[2], FACES[3] = clockwise(clockwise(e)), f, clockwise(g), antiClockwise(h)


def F2(FACES):
    for _ in range(2):
        F(FACES)


# 上(0),下(1),左(2),右(3),前(4),后(5)
def B(FACES):
    FACES[5] = clockwise(FACES[5])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[0], clockwise(clockwise(FACES_new[1])), clockwise(FACES_new[2]), antiClockwise(FACES_new[3])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    g[0], f[0], h[0], e[0] = a[0], c[0], b[0], d[0]
    FACES[0], FACES[1], FACES[2], FACES[3] = e, clockwise(clockwise(f)), antiClockwise(g), clockwise(h)


def _B(FACES):
    FACES[5] = antiClockwise(FACES[5])
    FACES_new = cp.deepcopy(FACES)
    a, b, c, d = FACES_new[0], clockwise(clockwise(FACES_new[1])), clockwise(FACES_new[2]), antiClockwise(FACES_new[3])
    e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d)
    e[0], g[0], f[0], h[0] = c[0], b[0], d[0], a[0]
    FACES[0], FACES[1], FACES[2], FACES[3] = e, clockwise(clockwise(f)), antiClockwise(g), clockwise(h)


def B2(FACES):
    for i in range(2):
        B(FACES)


'''
                          |************|
                          |*U1**U2**U3*|
                          |************|
                          |*U4**U5**U6*|
                          |************|
                          |*U7**U8**U9*|
                          |************|
              ************|************|************|************|
              *L1**L2**L3*|*F1**F2**F3*|*R1**R2**R3*|*B1**B2**B3*|
              ************|************|************|************|
              *L4**L5**L6*|*F4**F5**F6*|*R4**R5**R6*|*B4**B5**B6*|
              ************|************|************|************|
              *L7**L8**L9*|*F7**F8**F9*|*R7**R8**R9*|*B7**B8**B9*|
              ************|************|************|************|
                          |************|
                          |*D1**D2**D3*|
                          |************|
                          |*D4**D5**D6*|
                          |************|
                          |*D7**D8**D9*|
                          |************|
'''


def toString(FACES):
    print()
    for i in range(3):
        print("     ", int(FACES[0][i][0]), int(FACES[0][i][1]), int(FACES[0][i][2]))
    for i in range(3):
        print(int(FACES[2][i][0]), int(FACES[2][i][1]), int(FACES[2][i][2]), end=" ")
        print(int(FACES[4][i][0]), int(FACES[4][i][1]), int(FACES[4][i][2]), end=" ")
        print(int(FACES[3][i][0]), int(FACES[3][i][1]), int(FACES[3][i][2]), end=" ")
        print(int(FACES[5][i][0]), int(FACES[5][i][1]), int(FACES[5][i][2]))
    for i in range(3):
        print("     ", int(FACES[1][i][0]), int(FACES[1][i][1]), int(FACES[1][i][2]))
    print()


def moves(FACES, lst):
    for x in lst:
        if x == 'U':
            U(faces)
        elif x == 'u':
            _U(faces)
        elif x == 'D':
            D(faces)
        elif x == 'd':
            _D(faces)
        elif x == 'L':
            L(faces)
        elif x == 'l':
            _L(faces)
        elif x == 'R':
            R(faces)
        elif x == 'r':
            _R(faces)
        elif x == 'F':
            F(faces)
        elif x == 'f':
            _F(faces)
        elif x == 'B':
            B(faces)
        elif x == 'b':
            _B(faces)


lst = input("请输入步骤:")
moves(faces, lst)
print("执行后的魔方为")
toString(faces)
reverse = ''.join(map(chr, map(lambda x: ord(x) ^ 32, lst)))[::-1]
moves(faces, reverse)
print("魔方恢复步骤:", reverse)
toString(faces)

示例

请输入步骤:UBLDFRULFDRULBGBVFDRLLBFLLDSSDBVDJFRUDLRFBDLFBbdj
执行后的魔方为

      2 5 3
      5 0 2
      5 0 5
5 2 3 1 2 1 2 4 0 4 0 0
1 2 3 1 4 5 1 3 1 4 5 2
2 5 2 4 4 3 1 0 5 3 4 4
      1 0 4
      3 1 3
      0 3 0

魔方恢复步骤: JDBbfldbfrldurfjdvbdssdllfbllrdfvbgblurdflurfdlbu

      0 0 0
      0 0 0
      0 0 0
2 2 2 4 4 4 3 3 3 5 5 5
2 2 2 4 4 4 3 3 3 5 5 5
2 2 2 4 4 4 3 3 3 5 5 5
      1 1 1
      1 1 1
      1 1 1


Process finished with exit code 0

注:大写为顺时针,小写为逆时针

到此这篇关于python实现三阶魔方还原的示例代码的文章就介绍到这了,更多相关python 三阶魔方还原内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
比较详细Python正则表达式操作指南(re使用)
Sep 06 Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
python实现合并两个数组的方法
May 16 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
python实现横向拼接图片
Mar 23 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
python 实现压缩和解压缩的示例
Sep 22 Python
python基于opencv批量生成验证码的示例
python基于tkinter制作下班倒计时工具
Apr 28 #Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
k-means & DBSCAN 总结
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 #Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
python实现腾讯滑块验证码识别
Apr 27 #Python
You might like
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
python采集博客中上传的QQ截图文件
2014/07/18 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
python根据时间获取周数代码实例
2019/09/30 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
python 基于opencv实现图像增强
2020/12/23 Python
一道SQL面试题
2012/12/31 面试题
J2EE相关知识面试题
2013/08/26 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
小学生暑假家长评语
2014/04/17 职场文书
教师评语大全
2014/04/28 职场文书
派出所所长先进事迹
2014/05/19 职场文书
支部鉴定材料
2014/06/02 职场文书
团干部培训方案
2014/06/03 职场文书
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers