魔板 (BFS-HASH)题解

题目

魔板
 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板。这是一张有8个大小相同的格子的魔板:
1 2 3 4
8 7 6 5
  我们知道魔板的每一个方格都有一种颜色。这8种颜色用前8个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示。这是基本状态。
  这里提供三种基本操作,分别用大写字母“ A A A”,“ B B B”,“ C C C”来表示(可以通过这些操作改变魔板的状态):
“ A A A”:交换上下两行;
“ B B B”:将最右边的一列插入最左边;
“ C C C”:魔板中央四格作顺时针旋转。
  下面是对基本状态进行操作的示范:
A: 8 7 6 5
1 2 3 4
B: 4 1 2 3
5 8 7 6
C: 1 7 2 4
8 6 3 5
  对于每种可能的状态,这三种基本操作都可以使用。
  你要编程计算用最少的基本操作完成基本状态到目标状态的转换,输出基本操作序列。


输入

只有一行,包括8个整数,用空格分开(这些整数在范围 1——8 之间),表示目标状态。


输出

L i n e Line Line 1: 包括一个整数,表示最短操作序列的长度。
L i n e Line Line 2: 在字典序中最早出现的操作序列,用字符串表示,除最后一行外,每行输出60个字符。


样例

input
2 6 8 4 5 7 3 1

output
7
BCABCCB


解题思路

广搜遍历状态
哈希判重
存父节点以及步数
输出用递归


代码

#include<iostream>
#include<cstdio>
using namespace std;
const int p=100003;
int t,d[100010],n[100010];
bool b;
int w[3][8]={{8,7,6,5,4,3,2,1},{4,1,2,3,6,7,8,5},{1,7,2,4,5,3,6,8}};
string s,a[100010],f[100010];
char c,lg[100010];
bool hash(string y)
{int sum=0,i=0;for (int i=0;i<8;i++)sum=sum*10+(y[i]-48);  //字符串转数字sum=sum%p;while (i<p&&a[(i+sum)%p]!=""&&a[(i+sum)%p]!=y)i++;  //找到空位置if (a[(i+sum)%p]=="")  {a[(i+sum)%p]=y;  //存进状态return false;  //返回假,第一次出现}else return true;  //返回真,已出现
}
void gs()
{b=hash("12345678");f[1]="12345678";t=1;int h=0;do{h++;for (int i=0;i<3;i++){t++;d[t]=h;  //存父节点f[t]="";n[t]=n[h]+1;  //累计步数if (i==0) lg[t]='A';  else if (i==1) lg[t]='B'; else if (i==2) lg[t]='C';  //判断操作for (int j=0;j<8;j++)f[t]+=f[h][w[i][j]-1];  //改变状态if (hash(f[t])) t--;   //已出现,队列长度减1else if (f[t]==s) return;   //第一次出现,如果是目标状态,退出}}while (h<t);
}
void sc(int t)
{if (t==1) return;sc(d[t]);printf("%c",lg[t]);
}
int main()
{for (int i=1;i<=8;i++){scanf("%c",&c);s+=c;scanf("%c",&c);}if (s=="12345678"){cout<<0;return 0;}gs();printf("%d\n",n[t]); sc(t);  //递归输出return 0;
}

魔板 (BFS-HASH)题解相关推荐

  1. Magic Squares 魔板 (BFS+HASH)

    Description 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8 ...

  2. hdu.1430.魔板(bfs + 康托展开)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  3. 【题解】Luogu P2730 魔板

    蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...

  4. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  5. 魔板 Magic Squares(bfs优化)

    [USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...

  6. 【BFS】魔板(c++基础算法)

    本专栏上一篇:[BFS]八数码问题(c++基础算法) 目录 一.读题 ①题面 ②题意 三.做题 ①算法原理 ②算法实现 Ⅰ三种基本操作 Ⅱ操作序列 Ⅲ输出 Ⅳ一个特殊情况 四.AC代码 最后 一.读题 ...

  7. 题解 2360: [信息学奥赛一本通-T1449]魔板

    在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表 ...

  8. USACO 3.2 Magic Squares 魔板

    题目大意: 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8 ...

  9. P2730 魔板 Magic Squares

    不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...

最新文章

  1. VC2010 编译问题
  2. (Spring)AOP-面向切面编程
  3. java 带点的字符串处理,关于android:java中字符串上带点的分割函数
  4. 使用计算机计算一个多边形,多边形面积计算器
  5. 利用PhantomJS进行网页截屏,完美解决截取高度的问题
  6. linux增加datavg的大小,linux lvm扩容
  7. 120个常用货源网站,赶紧收藏!
  8. SpringBoot:AOP切面execution表达式
  9. OpenCv——OpenCv2 Mat创建、复制、释放
  10. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
  11. 商务网站建设与维护【4】
  12. linux硬盘的两个分区合并_linux 多分区合并(lvm)实例
  13. QML用径向渐变做波纹效果
  14. Openssl-AES加密
  15. inspect的使用
  16. 机器学习 | 从文本分析看《解忧杂货店》
  17. 蒸发器分段设计matlab程序_蒸发器计算函数matlab
  18. 动态沙箱是威胁防御的关键所在
  19. [bzoj3711]Druzyny
  20. 图形加速卡技术 [专业的基础技术文章]

热门文章

  1. 糖代谢紊乱及糖尿病的检查题库【1】
  2. 声学多普勒流速剖面仪_水平声学多普勒流速剖面仪
  3. 关于PBR流程的小概念
  4. PKG_PROG_PKG_CONFIG: command not found 解决方法
  5. 关于h5绘制canvas生成图片的注意点!
  6. LaTeX学习笔记(中文版使用)
  7. 两种常用AD转换数字滤波方法
  8. 2018年互联网发展趋势预测
  9. IntelliJ IDEA overlays Maven
  10. 开课啦!图观™应用编辑器 零基础入门课(第一讲)