二阶魔方复原算法推算-Part1
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
1. 二阶魔方
对于魔方来说,二阶魔方算是比较简单的,共有8个顶角块,上面四个块,下面四个块:可以分为
前面四个角块:左前上,左前下,右前上,右前下
后面四个角块:左后上,左后下,右后上,右后下
魔方的面有六个,可以分为前后左右上下,一般来说可以用几个简写字母代替:
F-Front
B-Back
L-Left
R-Right
U-Up
D-Down
2. 还原过程
还原过程:还原过程一般分为几个步骤,选其中任一种颜色为底部
首先:底部还原,还原后达到要求:底部颜色一致 + 底部块位置排序正常–周边颜色对齐。
例如下面这张图片上,该选定红色底面周边紧挨着的黄色、蓝色都是对齐的、以及遮挡掉的白色、绿色也都是对齐的:
接着:顶部块位置排序还原,还原后达到要求:顶部块都占据各自应该所在的位置,但颜色上需要旋转后才能颜色对齐。
例如下面的图片,底部是还原好的,顶部当前各个块位置都是正常排布的:能明显看到绿色的两个角块是在一起的,也能看到白色两个角块也是在一起的;被遮住侧的两个黄色角块与蓝色角块也是在一起的,只要角块在原位置旋转就会整个颜色对齐。
最后:顶部还原,达到要求:在最终不影响顶部块位置排序基础上,把块颜色旋转好。
(这其中提了两个概念:一个是颜色还原 vs 块位置排序还原;例如底部还原,颜色还原比较好理解,但如果块位置排序不正确的话,周边的颜色就会不正确。例如块排序应该是1234,但1432也能让底部颜色一致,但却不能让周边颜色也正确。)
3. 转动-旋转
转动的过程对于任意一个角块来说:
a. 块位于三个面上,在每个面上都能发生正时针旋转和逆时针旋转。
b. 对块的旋转,转动一步,块跟着延旋转面旋转90度。
所以对于角块来说,他都有六种不一样的旋转方式;这六种方式把角块带到了相邻的3个角块位置(带到角块同一位置处分别可以从相邻的两个面上分别带过去,相邻面呈90度垂直关系,带过去后块也呈90度旋转关系)。
同时,任意一块的转动带动整个面发生转动,面上所有块都会一起延正时针或逆时针旋转,所以对于角块的转动可以归为对于所在面的旋转。
综上:对于一个正常放置的魔方而言,操作旋转的方式有12种,分别是对六个面的正旋与逆旋。表达为F,F‘,B,B’,L,L’,R,R’,U,U’,D,D’。
4. 底部还原
在同一个面上,逆时针与顺时针互为逆操作,例如R+R‘=0-未旋转。但是如果把R+R‘中间插入其它操作,就可以形成一个特殊的变换。
常见的方法RUR‘,RU2R‘,RU’R’,可以把底面上的右前下角块换掉,换成Up面上除右后上三个角块中的一个。该操作,对右面的影响是,右面的-右前上,右前下都会发生变更。对于顶面来说,这三种情况带来的效果都是,把顶面的一个角块换到下面,同时顶面上的角块位置进行了几种调换,先是把底面上的角块放到左前上原连接右前上的位置,然后把右后上的前面连接到的右前上换成 左后上/左前上/右前下。
借助与顺时针+逆时针中间添加另一面的单向操作,可以完成对设定底面的任意一个块的替换,并且不会影响到底面其它三个块,所以这个方法可以支撑底面还原。
5. 顶部块位置排序还原
顶部位置排序还原时,要确保前提是不破坏底部已还原好的部分,所以顶部位置排序还原算法种应该能够把对底部的变动在结束后消除掉。
借助与上面的类似RU‘R的操作,把一个底角换到上面,从影响消除的角度,可以反向执行R’UR,立刻可以把底角换回来,不过这种纯逆操作也同时对顶面没有影响,不符合要求。另一个角度,从角块的角度考虑,一个角块有三个面,底面不变的前提下,可以从一个侧面换出去,从另一个侧面换进来,这样的变换就会在不影响底面的前提下,对顶面形成干扰。
解题的思路就是:从角块的一侧面换出,从角块的另一侧面换入;使用这个方法,需要对角块进行一个竖向的90度旋转,借助换出时的回退步骤,或者换入时的开始步骤都可以用于实现90度旋转。
以右前下角为例,这样的组合策略有:6种
RU’R’U‘F’UF(右后上角块位置颜色不变,左前上颜色不变,左前上角块与右前上互换位置)
RUR‘U’F‘U’F(左前上角块位置颜色不变,右前上颜色不变,右前上与右后上位置互换)
RU2R‘U2F’U‘F(右后上与左前上角块颜色不变,左前上角块与左后上互换位置)
以及逆操作
F‘U’FURUR’(右后上角块位置颜色不变,右前上颜色不变,左前上角块与右前上互换位置)
F’UFURU’R‘(左前上角块位置颜色不变,右后上颜色不变,右前上与右后上位置互换)
F‘UFU2RU2R’(左前上与右前上角块颜色不旋转,右前上角块与右后上互换位置)
借助从底部角块从一侧换出,从另一侧换入,实现底部不变,顶部角块换位/旋转,最终实现顶部的排序正常。换位的过程或一次或两次,一般都可以把角块位置换好,部分情况也直接把顶部块颜色也还原好了,直接完工。
6. 顶部块颜色还原
继底部还原+顶部块次序调整好后,接下来就是顶部颜色的还原,顶部颜色的还原需要达到的前提要求是:保证之前的要素不变,顶部还原需要在最后步骤时保持住底部还原与顶部块次序不变。
同样是借助于类似RUR’,RU2R‘(RU’R‘是不能够使用的,它会触发底部竖向旋转)的组合操作,不过这次借助的是从一侧换出,最终还是从该侧换入,保证了顶部次序不变。
仍然以右前下角块交换块为例,组合策略有:
从右侧面进行变换:
RU2R‘U’RU’R’ (右后上块保持不变,上面其它块逆时针旋转90度)
RUR‘URU2R‘(左前上块保持不变,上面其它块顺时针旋转90度)
从左侧面进行变换与从右侧效果类似:
F’U’FU’F’U2F(右后上块保持不变,上面其它块逆时针旋转90度)
F’U2FUF’UF(左前上块保持不变,上面其它块顺时针旋转90度)
这种策略可以保证了保持其中右后上或左前上块不变的情况下,完成顶面其它3个块的90度旋转。有的是顺时针旋转90度,有的是逆时针旋转90度,顺时针与逆时针可以互相还原。同时也可以把一个操作执行3次,旋转270度,还原自身。
经过顶侧的还原策略执行后,最终完成了整个魔方的还原。
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
二阶魔方复原算法推算-Part1相关推荐
- 二阶魔方复原算法推算-Part2
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 接上个文章继续往后讨论,梳理一个顶层逆序的算法公式推算. 1. 基础变换影响分析 先来再深入分析RUR' ...
- DBFS解二阶魔方——一次c++学习之旅
目录 前言 构思解法 优化方案 代码及详细注释 1.定义魔方的一个状态 2.状态初始化 3.转动 4.查重 5.双向广搜 6.输出 7.输入 8.主函数 几段实用代码 前言 本人是c++初学者,对魔方 ...
- 【NOJ1325】【算法实验三】【分支限界法】特殊的二阶魔方
1325.特殊的二阶魔方 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 魔方大家应该都玩过.现在有一个特殊的二阶魔方,它只有一面是白色,其余五个面全是黑色.玩这个魔方当然也 ...
- python解魔方程序_写一个解二阶魔方的程序
本文需要读者有一定的魔方基础, 最起码也要达到十秒内还原二阶魔方的水平, 并且手上最好有一个二阶魔方, 否则文中的很多东西理解不了. 另外, 这里使用的算法是我自己写着玩的, 如果你需要更成熟和专业的 ...
- 利用BFS广度优先搜索还原二阶魔方
利用BFS广度优先搜索还原二阶魔方 采用BFS深度优先搜索算法进行了对于魔方求解问题的建模,并且利用C++代码进行了算法实现,能够实现输入魔方状态,自动输出解法的效果. BFS是图论中一种基本的搜索算 ...
- 【二阶魔方还原】第十次OJ的总结
问题描述 二阶魔方是 2x2x2 的立方体结构魔方,它共有 8 块,如下图所示: 图1 二阶魔方示意图 我们可以定义魔方作为一个正六面体的六个面为 F(ront), B(ack), U(p), D( ...
- 二阶魔方还原 Rubik’s Cube 双向广度优先搜索
1. 算法简介 使用搜索算法完成二阶魔方从任意初始状态向目标状态的操作转换. 根据已有的研究,二阶魔方的上帝之数为11(进行FTM计数)或14(进行QTM计数),本算法采用QTM计数对 ...
- 【项目实践】二阶魔方搜索算法
前言 课程<智能控制基础>课后作业要求编写一个二阶魔方搜素求解的算法,由于本人的代码水平真的不行,只能"面向互联网编程",前前后后找了不少资料,也确实学习到一点东西 ...
- 魔方(4)二阶魔方、六阶魔方、七阶魔方
目录 二阶魔方 1,二阶魔方与三阶魔方的关系 2,二阶魔方的定位 3,二阶魔方的盲拧 六阶魔方 七阶魔方 二阶魔方 1,二阶魔方与三阶魔方的关系 可以理解为,二阶魔方就是三阶魔方的八个角块. ...
最新文章
- python就业方向及工资-Python的就业方向有哪些?
- tiny core linux 编译,tinycore linux使用
- 郭明錤:全新设计AirPods Pro2将于2022年末推出
- 使用mongoose来创建嵌入式websocket客户端和http客户端
- 随想录(cpu缓存、cache同步和乱序执行)
- 面试官:亿级流量架构分布式事务如何实现?我懵了。。
- 百度文库免下载券下载的方法
- 华为鸿蒙os logo,华为鸿蒙OS Logo曝光:Powered by HarmonyOS
- 【原创纯手打】VUE徒手搭各类脚手架详解
- 雅虎邮箱为什么停止服务_雅虎的发展项目将变成什么样?
- 微信被动添加好友限制,如何无上限好友被动添加???
- HIVE优化系列(1)-- 自动合并输出的小文件
- 公众号回调,突破每月只能修改三次的限制
- python如何定义矩阵_基础 | Python下的矩阵定义 (下)
- 深度学习车辆检测实现自动驾驶
- php 获取agent,PHP解析HTTP_USER_AGENT 获取客户端浏览器以及版本号 | 八戒哥技术博客...
- IPv6、特殊常用的IP地址
- quick-cocos2d-x 飞机大战(打飞机)小demo教程------敌人类
- CoolShell puzzle game writeup
- 指令集创始人潘爱民博士参加之江实验室“第二届智能计算创新论坛”并作报告...