魔板 (BFS-HASH)题解
魔板 (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)题解相关推荐
- Magic Squares 魔板 (BFS+HASH)
Description 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8 ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 【题解】Luogu P2730 魔板
蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 魔板 Magic Squares(bfs优化)
[USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...
- 【BFS】魔板(c++基础算法)
本专栏上一篇:[BFS]八数码问题(c++基础算法) 目录 一.读题 ①题面 ②题意 三.做题 ①算法原理 ②算法实现 Ⅰ三种基本操作 Ⅱ操作序列 Ⅲ输出 Ⅳ一个特殊情况 四.AC代码 最后 一.读题 ...
- 题解 2360: [信息学奥赛一本通-T1449]魔板
在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表 ...
- USACO 3.2 Magic Squares 魔板
题目大意: 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8 ...
- P2730 魔板 Magic Squares
不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...
最新文章
- VC2010 编译问题
- (Spring)AOP-面向切面编程
- java 带点的字符串处理,关于android:java中字符串上带点的分割函数
- 使用计算机计算一个多边形,多边形面积计算器
- 利用PhantomJS进行网页截屏,完美解决截取高度的问题
- linux增加datavg的大小,linux lvm扩容
- 120个常用货源网站,赶紧收藏!
- SpringBoot:AOP切面execution表达式
- OpenCv——OpenCv2 Mat创建、复制、释放
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
- 商务网站建设与维护【4】
- linux硬盘的两个分区合并_linux 多分区合并(lvm)实例
- QML用径向渐变做波纹效果
- Openssl-AES加密
- inspect的使用
- 机器学习 | 从文本分析看《解忧杂货店》
- 蒸发器分段设计matlab程序_蒸发器计算函数matlab
- 动态沙箱是威胁防御的关键所在
- [bzoj3711]Druzyny
- 图形加速卡技术 [专业的基础技术文章]