前言
课程《智能控制基础》课后作业要求编写一个二阶魔方搜素求解的算法,由于本人的代码水平真的不行,只能“面向互联网编程”,前前后后找了不少资料,也确实学习到一点东西,记录一下。
参考链接
- 写一个解二阶魔方的程序 - 博客园
- 二阶魔方还原C++实现 - CSDN——这个资源没有注释,慎!
- 2阶魔方的复原的BFS写法 - CSDN
- MATLAB实现二阶魔方仿真 - CSDN
- 用python还原二阶魔方 - CSDN——算是直系学长了。。。
- 二阶魔方(仿真问题)- CSDN——用坐标系编码,非常形象
正文
利用搜索算法求解二阶魔方的关键点主要有两个:魔方状态编码和搜索算法的编写。
先说第一个,魔方状态编码,关于这个不同的人有不同的方式,但是就我找到的资料来看,比较常用的都是使用一个24位的字符串来编码,一听到24,基本就是讨论魔方展开时的状态了。
首先,我们先规定一个魔方拿在手上的位置,如下图所示,并约定好展开方式,这样就可以得到24个面,如下图所示。
因此,每次解决一个魔方时,输入的当前魔方的状态都是手动按照约定的规则来转换的一个24位的字符串或者24个数字,(这也是这种方法不太方便的一个点)
确定了状态的编码方式,接下来就是旋转操作函数的编写了,这里我们约定只进行三种方向的旋转:右、上、前,然后每一种转动方向又有三种角度选择:顺时针90°、逆时针90°、180°,故每一种状态下都对应着9种操作,相当于是带有9个杈的树状结构。
说完结构,再说说代码编写方式:先按照你自己设定的方位,然后看转动一次之后哪些数字发生了移动,然后交换对应的数字即可,难度不大。
底层操作函数写完之后,下面就是顶层的搜索算法了,关于这个算法,似乎很多采用的都是广度优先搜索(BFS),这个算法没什么理解难度,关键是熟练使用队列、树等基本数据结构,这里就不再介绍了,建议直接参考上文参考链接。
感想与收获
这次的作业让我意识到只掌握C语言是不够,至少还要掌握一门面向对象的语言,如C++或者Python,真的很重要!而且基本数据结构也必须掌握。