上文还原了底部两层,接着还原顶面。

按前文所述,假定在绿色为底的情况下,还原了两层,整体翻转为蓝色为底,现要还原顶部绿色面,如下图:

1 算法

算法采用前文引用的参考文献(参考文献的顶部颜色为黄色):

图1

图2

先还原顶部十字,然后还原整个顶部面,总共用到了三个公式。

1.1 还原顶部十字

还原顶部十字比较简单,只有一个公式,检查魔方顶部符合图中三个条件之一,就可以套用公式,直到出现顶部十字。算法设计如下:

def formula_cmd(command_list):try:for command in command_list:eval(command)()except:pass
def 出现顶部绿十字():color_list=[cube_list[1][3][0],cube_list[2][4][0],cube_list[1][5][0],cube_list[0][4][0]]if color_list.count('green')==4:return Trueelse:return False
def 顶部一字绿():color_list = [cube_list[1][3][0], cube_list[1][4][0], cube_list[1][5][0]]if color_list.count('green')==3 and cube_list[3][4][0]=='green':return Trueelse:return False
def 还原顶部绿十字():while not 出现顶部绿十字():if (cube_list[3][4][0]!='green' or cube_list[3][7][0]!='green'):if not 顶部一字绿():right()continueformula_cmd(["F", "R", "U", "Rp", "Up", "Fp"])pass

1.2 还原顶部面

这一步较难,公式有两个,对应两个顶部状态,这两个公式的作用是可以分别将三个顶部棱侧面的颜色翻到顶部面,如果符合两个状态,则可以还原顶部。但是,顶部状态不只这两个,对于其他状态,也可以通过反复调用这两个公式,将其他状态转换为图中的两个状态,并最终还原顶部面。

传统的思维方法是采用OOA中的方法,建立状态转换图,然后根据状态转换图,建立“状态-动作‘’判定表,就可以解决此问题,但问题是状态有点多,需要分析出全部状态,和全部状态转换,工作量太大,因而不适合,需要转换思路。状态转换图(局部)如下(此例顶部为蓝色):

思路转换方法:观察图2中的状态,通过实验,发现不管顶部状态怎么变化,都可以按蓝色块的数目来分类:5、6、7三种,顶部状态在这三种蓝色块数之间转换,我们需要的是蓝色块数为6的状态,此状态在两种公式之一的转换下,必能还原整个顶部面。所以算法只需要按照图2中的公式,预先计算状态变换前、后的顶部蓝色块数,尽可能朝6靠近,就可以得到我们想要的状态,并最终还原整个顶部面。算法描述如下:

def 顶部绿块数(): #计算顶部绿色块数count=0for i in range(3):for j in range(3,6):if cube_list[i][j][0]=='green':count+=1return count
def planA绿块数(): #计算如果使用公式1,顶部达到的绿色块数blue_cell_number=顶部绿块数()color_list=[[cube_list[3][5][0],cube_list[2][5][0]],[cube_list[3][2][0],cube_list[2][3][0]],[cube_list[3][11][0],cube_list[0][3][0]]]for i in range(3):if color_list[i][0]=='green':blue_cell_number+=1else:if color_list[i][1]=='green': #原来的顶部面的蓝色块被翻到侧面去了blue_cell_number-=1return blue_cell_number
def planB绿块数(): #计算如果使用公式2,顶部达到的绿色块数blue_cell_number=顶部绿块数()color_list=[[cube_list[3][3][0],cube_list[2][3][0]],[cube_list[3][6][0],cube_list[2][5][0]],[cube_list[3][9][0],cube_list[0][5][0]]]for i in range(3):if color_list[i][0]=='green':blue_cell_number+=1else:if color_list[i][1]=='green':blue_cell_number-=1return blue_cell_number
def 还原顶部绿面():while True:if 顶部绿块数()!=6:if planA绿块数()==6:formula_cmd(["L", "U", "Lp", "U","L","U","U","Lp"])continueif planB绿块数()==6:formula_cmd(["Rp", "Up", "R", "Up", "Rp", "U", "U", "R"])continueformula_cmd(["L", "U", "Lp", "U", "L", "U", "U", "Lp"]) else:  if planA绿块数()==9:formula_cmd(["L", "U", "Lp", "U", "L", "U", "U", "Lp"])breakif planB绿块数()==9:formula_cmd(["Rp", "Up", "R", "Up", "Rp", "U", "U", "R"])breakright()

2 运行结果

现在离最终计算机自动还原魔方只有两个步骤了。

Python练手项目:计算机自动还原魔方(4)还原底部两层+顶面相关推荐

  1. Python练手项目:玩转魔方

    最近读了魔方有什么难的,七步还原法 (toutiao.com),终于平生第一次把魔方还原了.以前拿起魔方瞎鼓捣,能还原一面都已经是侥幸.现在知道了,玩魔方是需要记公式的.问题在于,记公式对于我也很难. ...

  2. 70个Python练手项目列表 预祝大家 快乐

    小孩眺望远方,成人怀念故乡. 为此给大家分享一下珍藏的Python实战项目,祝大家节日快乐哦!!! Python 前言:不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说 ...

  3. Python毕设-【人脸签到系统】附源码/Python练手项目/Python毕业设计

    本人承诺只做技术分享,永不收费. V----------------->:专栏详情 文章目录 本人承诺只做技术分享,永不收费. V----------------->:专栏详情 一.背景 ...

  4. 70个Python练手项目列表,偷偷练习卷死他们

    不管学习哪门语言都要做出实际的东西来,这个实际的东西就是项目 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己 ...

  5. python练手项目:2048实现与总结

    python练手项目:利用curses界面对2048的实现与总结 涉及的知识点 基本实现 UI展示 curses的初始化方法:wrapper curses的屏幕展示语句:addscr curses正式 ...

  6. Python毕设-【课堂人脸签到系统】附源码课件/Python练手项目/Python毕业设计

    Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 文章目录 Python毕设-[课堂人脸签到系统]附源码课件/允许白嫖 系统简介 一.本课题拟解决的问题 二.系统技术栈 三.开发工具 四.数 ...

  7. 10个不到500行代码的超牛Python 练手项目

    10个不到500行代码的超牛Python 练手项目 图:内容概览.注:本文内容由实验楼搜集.整理自Github,实际项目版权归原作者所有. 以下10个练手项目均摘录自一本尚未出版的 Python 神书 ...

  8. python项目-推荐 10 个有趣的 Python 练手项目

    想成为一个优秀的Python程序员,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼. 因此,我为大 ...

  9. 有趣的python项目 国外_推荐 10 个有趣的Python练手项目

    想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼,因此,我为大家准备了10个 ...

  10. python 适合做什么生意好_推荐 10 个有趣的 Python 练手项目

    想成为一个优秀的Python程序员,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼. 因此,我为大 ...

最新文章

  1. QQ群功能设计与心理学
  2. 如何看待「上帝掷骰子」这场概率骗局
  3. Oracle优化之表连接方式
  4. (转)FFMPEG解码H264拼帧简解
  5. 架构必备「RESTful API」设计技巧经验总结
  6. gis计算各省河流长度_用河流和各方解释安全漏洞
  7. 史上最强Dubbo面试28题答案详解:核心功能+服务治理+架构设计等
  8. 『高级篇』docker之安全认证kubernetes命令熟悉(40)
  9. [转载] 浅析Java中volatile关键字及其作用
  10. mysql connector读后记
  11. 直觉模糊有计算机知识嘛,多源直觉模糊信息系统的知识获取方法
  12. 天融信荣获《中国信息安全》2018年度“双推”活动两项荣誉
  13. AndroidStudio遇到的问题
  14. 代码整洁之道—技术分享
  15. SVG和G语言的混合显示引擎
  16. 如何在毕业论文Word中插入图表目录
  17. 测试新人如何提高工作效率
  18. HTML<a>,<img>标签介绍及用法
  19. Kermit使用(提权限)
  20. LINUX -SELL编程

热门文章

  1. A/Btest:组间的差异性检验,统计功效以及反选样本量,附python底层实现代码
  2. syslinux和grub引导linux,syslinux引导GRUB4DOS
  3. 寻路算法1:A星寻路和navmesh寻路的技巧和优化
  4. 解决JDK下载速度过慢的问题
  5. 全面讲解光纤、光模块、光纤交换机、光模块组网设计与案例
  6. win10联网进入msn页面,信号出现感叹号
  7. 问题 E: LZY去年买了个表
  8. 彻底理解RxJS里面的Observable 、Observer 、Subject
  9. python获取第一个字符_Python:获取列表中第一个字符串的第一个字符?
  10. 谷歌怎么设置下载位置