前言

  课程《智能控制基础》课后作业要求编写一个二阶魔方搜素求解的算法,由于本人的代码水平真的不行,只能“面向互联网编程”,前前后后找了不少资料,也确实学习到一点东西,记录一下。

参考链接

  • 写一个解二阶魔方的程序 - 博客园
  • 二阶魔方还原C++实现 - CSDN——这个资源没有注释,慎!
  • 2阶魔方的复原的BFS写法 - CSDN
  • MATLAB实现二阶魔方仿真 - CSDN
  • 用python还原二阶魔方 - CSDN——算是直系学长了。。。
  • 二阶魔方(仿真问题)- CSDN——用坐标系编码,非常形象

正文

  利用搜索算法求解二阶魔方的关键点主要有两个:魔方状态编码搜索算法的编写
  先说第一个,魔方状态编码,关于这个不同的人有不同的方式,但是就我找到的资料来看,比较常用的都是使用一个24位的字符串来编码,一听到24,基本就是讨论魔方展开时的状态了。
  首先,我们先规定一个魔方拿在手上的位置,如下图所示,并约定好展开方式,这样就可以得到24个面,如下图所示。


  因此,每次解决一个魔方时,输入的当前魔方的状态都是手动按照约定的规则来转换的一个24位的字符串或者24个数字,(这也是这种方法不太方便的一个点)

  确定了状态的编码方式,接下来就是旋转操作函数的编写了,这里我们约定只进行三种方向的旋转:右、上、前,然后每一种转动方向又有三种角度选择:顺时针90°、逆时针90°、180°,故每一种状态下都对应着9种操作,相当于是带有9个杈的树状结构。
  说完结构,再说说代码编写方式:先按照你自己设定的方位,然后看转动一次之后哪些数字发生了移动,然后交换对应的数字即可,难度不大。
  底层操作函数写完之后,下面就是顶层的搜索算法了,关于这个算法,似乎很多采用的都是广度优先搜索(BFS),这个算法没什么理解难度,关键是熟练使用队列、树等基本数据结构,这里就不再介绍了,建议直接参考上文参考链接。

感想与收获

  这次的作业让我意识到只掌握C语言是不够,至少还要掌握一门面向对象的语言,如C++或者Python,真的很重要!而且基本数据结构也必须掌握。

【项目实践】二阶魔方搜索算法相关推荐

  1. A*算法项目实践之一:栅格法的使用与障碍物栅格的生成

    A*算法项目实践之一:栅格法的使用与障碍物栅格的生成 栅格形状.大小的确定 栅格地图的生成--障碍物的生成 测试代码 MATLAB绘制栅格 使用路径搜索算法(本文使用A*算法)的第一步就是将地图用程序 ...

  2. 利用BFS广度优先搜索还原二阶魔方

    利用BFS广度优先搜索还原二阶魔方 采用BFS深度优先搜索算法进行了对于魔方求解问题的建模,并且利用C++代码进行了算法实现,能够实现输入魔方状态,自动输出解法的效果. BFS是图论中一种基本的搜索算 ...

  3. 【二阶魔方还原】第十次OJ的总结

    问题描述 二阶魔方是 2x2x2 的立方体结构魔方,它共有 8 块,如下图所示: 图1  二阶魔方示意图 我们可以定义魔方作为一个正六面体的六个面为 F(ront), B(ack), U(p), D( ...

  4. 二阶魔方还原 Rubik’s Cube 双向广度优先搜索

    1. 算法简介 使用搜索算法完成二阶魔方从任意初始状态向目标状态的操作转换.         根据已有的研究,二阶魔方的上帝之数为11(进行FTM计数)或14(进行QTM计数),本算法采用QTM计数对 ...

  5. SVM算法在项目实践中的应用!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士 支持向量机 ...

  6. SAP WM Storage Location Reference在项目实践中的使用

    SAP WM Storage Location Reference在项目实践中的使用 笔者目前所在的一个项目是一个已经上了SAP系统,但是需要扩展到新工厂的项目.该项目在组织结构设计的时候,结合业务的 ...

  7. 学习Unix,可从事什么样的工作(1)《精通Unix下C语言与项目实践》读书笔记(3)...

    <精通Unix下C语言编程与项目实践>读书笔记(new) 文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的 ...

  8. Node.js项目实践:构建可扩展的Web应用

    2019独角兽企业重金招聘Python工程师标准>>> Node.js项目实践:构建可扩展的Web应用 <Node.js项目实践:构建可扩展的Web应用>用专业的讲解方式 ...

  9. Unix下设计动态库的方法《精通Unix下C语言编程与项目实践》(一)

    精通Unix下C语言编程与项目实践 之动态库的生成 作者:朱云翔,胡平 3.3 动态库的生成 动态库的生成可分为三个步骤,设计库源码.编译位置无关码(PIC)型.o文件和链接动态库.链接动态库的命令包 ...

最新文章

  1. ADPRL - 近似动态规划和强化学习 - Note 10 - 蒙特卡洛法和时序差分学习及其实例 (Monte Carlo and Temporal Difference)
  2. 离开一线互联网大厂的年轻人在想什么?
  3. Mysql之case when用法总结
  4. 如何用两个开关控制同一盏灯
  5. python编程函数_python函数式编程
  6. 03.CSS选择器--交集并集选择器
  7. AnimMontage(中文翻译)——UE4官方文档
  8. php 管理员界面源码,ThinkPHP通用后台管理系统TP-Admin
  9. xp提示计算机内存不足,虚拟内存不足怎么处理,教你电脑虚拟内存不足怎么处理...
  10. SIM800C EAT开发
  11. powerdesigner中把用例关系线设置成直线
  12. Android 使用腾讯X5 Webview浏览器拍照或从相册上传图片
  13. DOTA2匹配机制详解
  14. java虚拟机线程数_Java虚拟机最多支持多少个线程?
  15. 接电路要用计算机测试嘛,ZY6502-PC型消防接口、水枪水压性能试验机
  16. 通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
  17. (10)stata的基本使用--短面板数据处理
  18. 2020-01-24
  19. oracle 数据库表结构对比
  20. 使用 Python 设置高斯模糊背景

热门文章

  1. oracle 9i 安装 linux,oracle9i在linux9下的安装
  2. 基于JavaSpringBoot+Vue+uniapp微信小程序实现在线房屋装修管理系统
  3. 国有建筑企业数字化转型怎么做?
  4. 2022-2027年中国资产管理行业市场调研及未来发展趋势预测报告
  5. Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法
  6. simulink中创建自定义模块库
  7. c语言keil代码大全,Keil中C语言汇编代码比较
  8. vue中使用pdf阅读器 --- pdf.js
  9. 【flutter】flutter多版本管理工具-fvm使用指南
  10. Shell爆破需要的资料[4]