# 10027. 「一本通 1.4 例 2」魔板

【题目描述】

Rubik 先生在发明了风靡全球魔方之后,又发明了它的二维版本——魔板。这是一张有 888 个大小相同的格子的魔板:

1 2 3 4
8 7 6 5

我们知道魔板的每一个方格都有一种颜色。这 8 种颜色用前 8 个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列 $1,2,3,4,5,6,7,8$ 来表示。这是基本状态。

这里提供三种基本操作,分别用大写字母 A,B,C 来表示(可以通过这些操作改变魔板的状态):

  • A:交换上下两行;
  • B:将最右边的一列插入最左边;
  • 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

对于每种可能的状态,这三种基本操作都可以使用。

你要编程计算用最少的基本操作完成基本状态到特殊状态的转换,输出基本操作序列。

【算法】

显然使用bfs,新知识点:cantor展开。注意魔板的输入顺序是顺时针。

【代码】

#include <bits/stdc++.h>
using namespace std;
int d[50010],rec[50010][2];
const int fac[]={ 1,1,2,6,24,120,720,5040,40320 };
struct state{ int now[2][4]; }st,ed;
queue<state> q;
int cantor(state& x) {
int tmp[8],res=0;
for(int i=0;i<2;i++)
for(int j=0;j<4;j++)
tmp[i*4+j]=x.now[i][j];
for(int i=0;i<8;i++) {
int s=0;
for(int j=i+1;j<8;j++) if(tmp[j]<tmp[i]) s++;
res+=s*fac[7-i];
}
return res;
}
void print(int x) {
if(x==cantor(st)) return;
print(rec[x][1]);
printf("%c",char(rec[x][0]));
}
int main() {
for(int i=0;i<4;i++) st.now[0][i]=i+1,scanf("%d",&ed.now[0][i]);
for(int i=0;i<4;i++) st.now[1][3-i]=4+i+1,scanf("%d",&ed.now[1][3-i]);
for(int i=0;i<=fac[8];i++) d[i]=-1;
d[cantor(st)]=0; q.push(st); while(q.size()) {
state now=q.front(),tmp; q.pop();
if(cantor(now)==cantor(ed)) break;
//A
for(int i=0;i<2;i++) {
for(int j=0;j<4;j++)
tmp.now[(i+1)%2][j]=now.now[i][j];
}
if(d[cantor(tmp)]==-1) {
d[cantor(tmp)]=d[cantor(now)]+1;
rec[cantor(tmp)][0]='A';
rec[cantor(tmp)][1]=cantor(now);
q.push(tmp);
}
//B
tmp.now[0][0]=now.now[0][3],tmp.now[1][0]=now.now[1][3];
for(int i=0;i<2;i++) {
for(int j=0;j<3;j++)
tmp.now[i][j+1]=now.now[i][j];
}
if(d[cantor(tmp)]==-1) {
d[cantor(tmp)]=d[cantor(now)]+1;
rec[cantor(tmp)][0]='B';
rec[cantor(tmp)][1]=cantor(now);
q.push(tmp);
}
//C
memcpy(tmp.now,now.now,sizeof(now.now));
tmp.now[0][1]=now.now[1][1]; tmp.now[0][2]=now.now[0][1];
tmp.now[1][1]=now.now[1][2]; tmp.now[1][2]=now.now[0][2];
if(d[cantor(tmp)]==-1) {
d[cantor(tmp)]=d[cantor(now)]+1;
rec[cantor(tmp)][0]='C';
rec[cantor(tmp)][1]=cantor(now);
q.push(tmp);
}
}
printf("%d\n",d[cantor(ed)]);
print(cantor(ed));
return 0;
}

魔板 (bfs+康托展开)的更多相关文章

  1. hdu1430魔板(BFS+康托展开)

    做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...

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

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

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

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

  4. HDU_1430——魔板,预处理,康托展开,置换,string类的+操作

    Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...

  5. HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】

    一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...

  6. HDU_1430 魔板 【BFS+康托展开+置换】

    一.题面 POJ1430 二.分析 该题与之前做的八数码不同,它是一个2*4的棋盘,并且没有空的区域.这样考虑的情况是很少的,依然结合康托展开,这时康托展开最多也只乘7的阶乘,完全可以BFS先预处理一 ...

  7. HDU - 1430 魔板 【BFS + 康托展开 + 哈希】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...

  8. HDU1430;魔板(BFS+康托展开)

    传送门 题意 给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小) 分析 字符串只有8个字符,使用康托展开. 1.BFS将所有序列从"123 ...

  9. hdu1430 魔板(康拓展开 bfs预处理)

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

随机推荐

  1. python的setup.py文件

    最近工作需要,用Cython写了*.pyx扩展,并将其编译成C文件,最后转换为so扩展,供python引用使用 distutils 编译,建立一个setup.py 的脚本from distutils. ...

  2. 接口测试的一些FAQ

    近期在学习接口测试,总会有很多问题,故把前任给的经验做个记录下. 1,测试一条delete接口,delete请求后要检验什么内容: 原来删除有分为:物理删除,删除资源,删除关系,软删除 一般delet ...

  3. php array_flip()函数 语法

    php array_flip()函数 语法 作用:用于反转/交换数组中所有的键名以及它们关联的键值.富瑞联华 语法:array_flip(array); 参数: 参数 描述 array 必需.规定需进 ...

  4. 最近在写一些树上的东西,先发一波LCA的吧!

    不会树剖的我只有去学tarjan和倍增了,个人觉得倍增比tarjan好打一点... tarjan学习的地方 http://www.cnblogs.com/JVxie/p/4854719.html 个人 ...

  5. codevs 2039 骑马修栅栏 USACO x

    题目描述 Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏 ...

  6. Activiti的分配任务负责人(八)

    1分配任务负责人 1.1 固定分配 在进行业务流程建模时指定固定的任务负责人 在 properties 视图中,填写 Assignee 项为任务负责人.注意事项由于固定分配方式,任务只管一步一步执行任 ...

  7. ORB an efficient alternative to SIFT or SURF

    AbstractFeature matching is at the base of many computer vision problems, such as object recognition ...

  8. Socket网络通信编程(一)

    1.学习基本概念.传统的同步阻塞式I/O编程.伪异步IO实现 2.学习基于NIO的同步非阻塞式编程 3.了解基于NIO2.0的异步非阻塞(AIO)编程 1.1 基本概念 Socket又称“套接字”,应 ...

  9. UE4从4.15移植到4.16

    如果是旧版本的工程需要移植到4.16,有几个地方需要修改: 假设RC是工程名,修改如下(三个CS文件) 类似的,插件也需要这样修改

  10. 在centos上配置环境

    1.   安装wget [root@localhost ~]# yum -y install wget 2.   在oneinstack官网配置安装环境 wget http://mirrors.lin ...