转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents by—cxlove
三阶魔方还原。因为只搜5层,所以使用IDA*搜索。由于每次旋转,每面中心颜色总不变,也就确定了最终的状态,找出每个面中与中间颜色不同的个数的最大值,其中每次旋转会更改每个面的3个位置的颜色,所以 就是(最大值+2)/3。
总共有12种旋转,找到其中的对应方式,使用转动数组就非常方便了,不过数组的初始化是相当蛋疼的工作,最好手头有个三阶魔方。顺时针与逆时针刚好对应。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//表示每个面除中间的另外8个的位置
short int cen[6][8]={{0,1,2,3,5,6,7,8},{9,10,11,21,23,33,34,35},{12,13,14,24,26,36,37,38},{15,16,17,27,29,39,40,41},{18,19,20,30,32,42,43,44},{45,46,47,48,50,51,52,53}
};
//转换数组,12种变换,两两对应,每次转换会更改20个位置
short int change[12][20]={{11,23,35,34,33,21,9,10,51,48,45,36,24,12,6,3,0,20,32,44},{9,10,11,23,35,34,33,21,36,24,12,6,3,0,20,32,44,51,48,45},{14,13,26,38,37,36,24,12,45,46,47,39,27,15,8,7,6,11,23,35},{12,24,13,14,26,38,37,36,39,27,15,8,7,6,11,23,35,45,46,47},{17,29,41,40,39,27,15,16,47,50,53,42,30,18,2,5,8,14,26,38},{15,16,17,29,41,40,39,27,42,30,18,2,5,8,14,26,38,47,50,53},{18,19,20,32,44,43,42,30,53,52,51,33,21,9,0,1,2,17,29,41},{42,30,18,19,20,32,44,43,33,21,9,0,1,2,17,29,41,53,52,51},{0,1,2,5,8,7,6,3,12,13,14,15,16,17,18,19,20,9,10,11},{6,3,0,1,2,5,8,7,15,16,17,18,19,20,9,10,11,12,13,14},{45,46,47,50,53,52,51,48,44,43,42,41,40,39,38,37,36,35,34,33},{51,48,45,46,47,50,53,52,41,40,39,38,37,36,35,34,33,44,43,42}
};
char a[54];  //初始状态
int depth;   //迭代加深搜索的层数
bool flag;   //是否有解
int centre[6]={4,22,25,28,31,49};//每个面中心坐标
int get_h(char *maze){int ret=0;for(int i=0;i<6;i++){int cnt=0;for(int j=0;j<8;j++)if(maze[cen[i][j]]!=maze[centre[i]])cnt++;ret=max(ret,cnt);}return (ret+2)/3;
}
int ans[10];
//调试用的,输出当前的形状
void debug(char *maze){int k=0;for(int i=0;i<3;i++){printf("      ");for(int j=0;j<3;j++)printf("%c ",maze[k++]);printf("\n");}for(int i=0;i<3;i++){for(int j=0;j<12;j++)printf("%c ",maze[k++]);printf("\n");}for(int i=0;i<3;i++){printf("      ");for(int j=0;j<3;j++)printf("%c ",maze[k++]);printf("\n");}}
void IDAstar(int tmp_depth,char *b,int father){if(flag)return;//A*剪枝if(get_h(b)>tmp_depth)return;if(tmp_depth==0){flag=true;return;}for(int i=0;i<12;i++){if(flag)return;if((i^father)==1)continue;char tmp[54];memcpy(tmp,b,54*sizeof(char));ans[tmp_depth]=i;//转换for(int j=0;j<20;j++)tmp[change[i][j]]=b[change[i^1][j]];;IDAstar(tmp_depth-1,tmp,i);}
}
char get_in(){char ch;while(1){ch=getchar();if(ch>='a'&&ch<='z')return ch;}
}
int main(){int t;scanf("%d",&t);while(t--){for(int i=0;i<54;i++)a[i]=get_in();flag=false;int Init=get_h(a);if(Init==0){printf("0\n");continue;}for(depth=Init;depth<=5;depth++){IDAstar(depth,a,-1);if(flag){printf("%d\n",depth);printf("%d %d",ans[depth]/2,(ans[depth]&1)?-1:1);for(int j=depth-1;j>0;j--)printf(" %d %d",ans[j]/2,(ans[j]&1)?-1:1);printf("\n");break;}}if(!flag)printf("-1\n");}return 0;
}

C++ 三阶魔方还原相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 三阶魔方大中小魔公式_三阶魔方还原公式

    1. 第二层棱块归位: 2. 顶层十字 3. 顶层棱中间块归位 这一步的目的是使顶层的4个棱中间块全部归位. 转动顶层(U),若可以使一个棱中间块归位(如下图左,这里以[红-黄]块为例),而其他3个都 ...

最新文章

  1. PMBOK(第六版) PMP笔记——《十一》第十一章(项目风险管理)
  2. OpenCASCADE:形状愈合之修复工具
  3. Codeforces Beta Round #17 C. Balance DP
  4. redis永久化存储
  5. zabbix server报错:FATAL: password authentication failed for user zabbix
  6. -moz、-ms、-webkit
  7. BeyondCompare This license key has been revoked:
  8. avs php,linux 安装AdultVideoScript (AVS)全教程
  9. Ubuntu下完全删除Edraw软件
  10. 【渝粤题库】陕西师范大学200061语言学概论作业(高起本、专升本)
  11. 电力电子技术实验仿真(一)
  12. Qt编译QtXlsx库
  13. 【区块链】以太坊Solidity编程:智能合约实现之基本语法
  14. HTTP 417 错误 – 预期结果失败 (Expectation failed)
  15. 知乎热榜的话题,为什么从阿里巴巴离职,大萌哥汇总了9大理由,看完我先柠檬酸了!
  16. HDU3713 Double Maze(BFS)
  17. 如何在Python中定义变量
  18. linux权限sudo和su,Linux中su与sudo、su - root的区别
  19. 2017年全球医疗器械公司TOP100分析表(转载)
  20. HTTP之Hop-by-hop首部

热门文章

  1. 用C语言多线程描述哲学家,C语言多线程之“哲学家就餐”问题
  2. 【经典】纪念米加艾尔·塔利维尔吉耶夫《春天的17个瞬间》音乐会[部分]
  3. pipe管道实现进程间的通信
  4. 应用拉氏变换分析线性电路
  5. 如何实现脑肿瘤红黄绿分割展示
  6. 《算法竞赛进阶》学习笔记
  7. Android Studio 3.1 正式版
  8. NumPy科学计算库(1)Python数据分析
  9. 虚拟机安装Ubuntu 16.04后要做的事
  10. 家庭电视橱 参考图片