Problem Description
在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:

1 2 3 4
8 7 6 5

对于魔板,可施加三种不同的操作,具体操作方法如下:

A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368

给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。

Input
每组测试数据包括两行,分别代表魔板的初态与目态。
Output
对每组测试数据输出满足题意的变换步骤。
Sample Input
12345678172453681234567882754631
Sample Output
CAC
Author
LL

第一道康拓展开题,由于魔板的第二行,由于是逆向的,所以我处理的时候将其看做是摆正的

也就是

1234

8765

而我处理的时候是

1234

5678

康拓展开的原理考研看这里:http://blog.csdn.net/zhongkeli/article/details/6966805

知道了原理之后,就不难解决了

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;string start,end,ans[50000];int hash[10],pos[10],vis[50000];struct node{    string step,str;    int val;};int solve(string &s){    int i,j,sum = 0;    for(i = 0; i<7; i++)    {        int cnt = 0;        for(j = i+1; j<8; j++)            if(s[i]>s[j])                cnt++;        sum+=cnt*hash[7-i];    }    return sum;}void fun_A(string &s){    for(int i = 0; i<4; i++)        swap(s[i],s[i+4]);}void fun_B(string &s){    char t=s[3];    for(int i=2; i>=0; i--)        s[i+1]=s[i];    s[0]=t;    t=s[7];    for(int i=6; i>=4; i--)        s[i+1]=s[i];    s[4]=t;}void fun_C(string &s){    char t=s[1];    s[1]=s[5];    s[5]=s[6];    s[6]=s[2];    s[2]=t;}void bfs(){    memset(vis,0,sizeof(vis));    node a,next;    queue<node> Q;    a.step = "";    a.str = start;    a.val = solve(start);    vis[a.val] = 1;    ans[a.val] = "";    Q.push(a);    while(!Q.empty())    {        a = Q.front();        Q.pop();        string t;        int k;        t = a.str;        fun_A(t);        k = solve(t);        while(!vis[k])        {            vis[k] = 1;            next = a;            next.step+='A';            ans[k] = next.step;            next.str = t;            next.val = k;            Q.push(next);        }        t = a.str;        fun_B(t);        k = solve(t);        while(!vis[k])        {            vis[k] = 1;            next = a;            next.step+='B';            ans[k] = next.step;            next.str = t;            next.val = k;            Q.push(next);        }        t = a.str;        fun_C(t);        k = solve(t);        while(!vis[k])        {            vis[k] = 1;            next = a;            next.step+='C';            ans[k] = next.step;            next.str = t;            next.val = k;            Q.push(next);        }    }}int main(){    int i,j;    hash[0] = 1;    for(i = 1; i<10; i++)        hash[i] = hash[i-1]*i;    start = "12345678";    bfs();    while(cin>>start>>end)    {        swap(start[4],start[7]);//把魔板板变为我所处理的状况        swap(start[6],start[5]);        swap(end[4],end[7]);        swap(end[6],end[5]);        for(i = 0; i<8; i++)            pos[start[i]-'0'] = i+1;        for(i = 0; i<8; i++)            end[i] = pos[end[i]-'0'];        int k;        k = solve(end);        cout << ans[k] << endl;    }    return 0;}

HDU1430 魔板 康托展开相关推荐

  1. HDU1430,魔板

    书上的推荐例题,在双向广搜里面.刚开始尝试用双向广搜,但是一直wa,看网上讨论才知道所得到的答案不一定是最小的字典序.此题比较纠结的是标记,普通做要开8维数组,但是如果用cantor展开之后,每一种状 ...

  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. 康托展开(hdu1430)

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

  5. 【题解】Luogu P2730 魔板

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

  6. [总结] 康托展开及其逆运算

    这里先贴一道例题 我们先科普一下康托展开 定义: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i ...

  7. 康托展开及其逆运算 详解

    前文: 这个东东是我准备进攻一道A*算法的八数码题目时,遇到的. 决定先搞懂这个,再进攻八数码(传说中  不做人生不完整的 题目). 康托展开是什么? 定义: X=an*(n-1)!+an-1*(n- ...

  8. 关于康托展开的用途及写法

    在处理八数码这一类需要用到全排列的问题的时候, 存储往往是一个难题, 因为明明只有n!种情况, 数字的长度却有n, 用数组是肯定不行的. 这个时候, 康托展开就派上了用场, 当然, 在条件允许的情况下 ...

  9. P2730 魔板 Magic Squares

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

最新文章

  1. 784.字母大小写全排列
  2. 【Nginx入门系列】第六章 Nginx+tomcat集群负载均衡部署
  3. 时间序列预测——线性回归(上下界、异常检测),异常检测时候历史数据的输入选择是关键,使用过去历史值增加模型健壮性...
  4. 《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.5 大数据系统应有的属性...
  5. MyBatis-学习笔记12【12.Mybatis注解开发】
  6. [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)
  7. gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号
  8. 欧菲光修正2020年业绩为预计亏损18.5亿元
  9. PHP linux spl_autoload_register区分大小写
  10. 好程序员web前端教程:字符串
  11. 洛谷P1156 垃圾陷阱【线性dp】
  12. final修饰的对象咋办?
  13. 银耳椰椰——Alpha冲刺Day01
  14. RocketMQ 内存优化
  15. 软件工程毕业设计课题(80)微信小程序毕业设计PHP电影视频播放小程序系统设计与实现
  16. YOLO模型train.py文件报错:size mismatch for last_layer0.6.weight: copying a param with shape torch.
  17. JAVA读取Excel表格,建数据库建表,并生成java实体实例
  18. c语言编程设计实验课件,c语言程序设计实验课件.ppt
  19. html蓝色粒子,HTML5 粒子编辑器
  20. 裸辞后进入华为,拿下34K测试岗offer....

热门文章

  1. Error:(7, 21) java: 程序包javax.servlet不存在
  2. 《新白发魔女传》之自创歌曲 《绝缘》
  3. python 提取视频中的音频 | Python工具类
  4. mysql udb_UDB高可用数据库内核深度优化
  5. linux虚拟光驱路径,Linux操作系统下虚拟光驱(iso)的挂载
  6. e站app里站hosts_“科普e站”启用 让科学触手可及
  7. 安搭Share:主播探店为实体店发展迎来新机遇
  8. css3音乐播放器,CSS3-自定义视频与音乐播放器!
  9. python初始化二维矩阵
  10. linux中文件权限 组,linux中文件权限格式与chmod命令以及用户和用户组的管理