python实现三阶魔方还原

思路

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

​ 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])
    

  • 每一个面的 顺时针逆时针 旋转由函数 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°。这时,我们只需按顺序交换每一面的第一行,最后再逆时针或顺时针转回来即可。

    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 facedef 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 35 0 25 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 41 0 43 1 30 3 0魔方恢复步骤: JDBbfldbfrldurfjdvbdssdllfbllrdfvbgblurdflurfdlbu0 0 00 0 00 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 51 1 11 1 11 1 1Process finished with exit code 0

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

最后要感谢本次实验的主要贡献者:

python实现三阶魔方还原相关推荐

  1. 三阶魔方还原程序心得

    第一次写技术性的博客啊,本人菜鸟,如果哪里说的不够准确完善,欢迎大神前来点拨呀~ 先放几张效果图吧~ 这是我最近做的一个三阶魔方还原的小程序. 用的环境是VC++6.0,其中也大量运用了easyx库进 ...

  2. C++ 三阶魔方还原

    转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents by-cxlove 三阶魔方还原.因为只搜5层,所以使用IDA*搜索.由于每次 ...

  3. 三阶魔方还原的13种程序实现

    三阶魔方还原的13种程序实现 文末附程序下载 src:http://tomas.rokicki.com/cubecontest/winners.html 译者:WilliamYu Copyright ...

  4. ZOJ 2477 Magic Cube 三阶魔方还原(IDA*)

    转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 三阶魔方还原.因为只搜5层,所以使 ...

  5. 二阶魔方 三阶魔方还原法

    二阶魔方 三阶魔方还原法  二阶魔方归正: 1 下面蓝色  不停用 上右下左,直到下面全蓝 2 翻动蓝色到上方,  找到左右的上侧 两个相同的颜色固定 ,然后  上右下推  上右下左 下压上 上左下左 ...

  6. 三阶魔方还原步骤图_研究人员开发的AI成功在1.2秒内还原三阶魔方

    据外媒报道,在2018年3月,麻省理工学院学生Ben Katz和软件开发人员Jared Di Carlo曾共同创建了机器人装置,以0.38秒解开三阶魔方.尽管魔方解开技术的最新重大进展并没有导致比Ka ...

  7. python实现魔方复原_大佬们帮忙看一下,python解三阶魔方有沒有更快的方法

    #导入easygui模块 import easygui as eg #得到每一面的颜色分布(里面说的图片在下面) b = eg.multenterbox("请按从上到下,从左到右的顺序输入中 ...

  8. 三阶魔方还原 two phase 算法 学习笔记

    twophase算法,或者Kociemba's Algorithm. wiki说,目前速度最快且解决魔方平均步骤最少的软件是Cube Explorer.[1] 以下是按照官网上作者公开的mathema ...

  9. 三阶魔方还原步骤图_(六)最简单的三阶魔方入门教程——顶面还原

    本系列教程适合刚刚接触魔方,又比较有好奇心,是为渴望学会还原魔方,又不想死记公式的人准备的.全部教程只使用三种公式,还原过程以理解为主,公式为辅. 第六部分 顶面黄色还原 6.1 预览顶面还原后的效果 ...

  10. 三阶魔方还原方法(白色在上层先法)

    2020-5-9 最近买了个小米的智能魔方,学会了解魔方的方法.分享给大家! 玩魔方可以锻炼手指,手脑协作,解压. 1.白色小花 2.白色十字 3.上层还原 D'R'DR 4.中层还原 5.黄色十字 ...

最新文章

  1. 基于Erlang语言的视频相似推荐系统 | 深度
  2. volatile实现禁止指令重排底层操作原理
  3. Js——event详解
  4. 数据结构与算法专题——第二题 优先队列
  5. spring 线程池_Spring线程池服务
  6. 前端学习(2320):typeScript的概述和安装
  7. 程序员面试金典 - 面试题 01.08. 零矩阵
  8. 腾讯视频云支持超300万场次直播带货 助力企业一天搭建直播间
  9. 双手无法敲代码的程序员,该如何编程?
  10. linux glibc 升级失败,glibc升级失败后的处理过程
  11. 感性电路电流计算_三相电的电功率的计算公式_200KW三相四线制线路,需要多少A电源空开?...
  12. 冒险岛V79个人用私服搭建回顾
  13. 英语学了十年,还是学不会!建议你:那就别学了!
  14. 【小5聊】前端基础之上传图片等文件IE浏览器是会显示两个请求
  15. 关于SEO与搜索引擎排名现状分析与SEO去向
  16. linux pam mysql,Linux-PAM PAM-MySQL的总结
  17. 群硕入列FoodTalks优质供应商地图数字化板块
  18. 【JavaSE专栏内容导航】JavaSE与数据结构基础知识系列
  19. 中国银行国内分支机构SWIFT代码
  20. 网络摄像机(IPC)介绍

热门文章

  1. .rpt文件内容读取java_python读取Excel,12代码将Excel内容写入txt文件
  2. 微信小程序独立服务器的好处,微信小程序的优势和缺点
  3. 解决jinjia2 for循环变量作用域问题
  4. 案例|工业物联网解决方案•空调系统智能监控运维云平台
  5. win10 nginx设置开机启动 --亲测有效
  6. NFS 服务端配置流程
  7. java生成word目录_Apache POI自动生成Word文档(带目录)
  8. 什么是SRE?一文详解SRE运维体系
  9. 移动计算机无线网络,【移动网络论文】计算机无线网络安全技术应用(共3819字)...
  10. 对多媒体框架的几点看法