题目链接

题目描述

在魔方风靡全球之后不久,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

12345678
17245368
12345678
82754631

Sample Output

C
AC

题意:
给定一个序列怎么通过A,B,C操作变成目态
先bfs把初态“12345678”能通过A,B,C操作能的到的序列先存下来
相当于打表,bfs搜索时其实可以通过map去重,我是用的康托展开去重的
康托展开
最后把目标项转成12345678型的
eg:
初态
4 1 3 6 7 8 2 5
可以对应成
1 2 3 4 5 6 7 8
目态
4 6 7 2 1 3 8 5
对应
1 4 5 7 2 3 6 8
所以就是可以当成12345678---->14572368

#include <bits/stdc++.h>
using namespace std;
string start="12345678";
string end1,ans[50000];
int fac[10],pos[10],vis[50000];struct node {string str,step;int can;
};int KT(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*fac[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() {node now,next;queue<node> que;now.step = "";now.str = start;now.can = KT(start);vis[now.can] = 1;ans[now.can] = "";que.push(now);while(!que.empty()) {now = que.front();string t;int k;t = now.str;fun_A(t);k = KT(t);if(!vis[k]) {vis[k] = 1;next = now;next.step+='A';ans[k] = next.step;next.str = t;next.can = k;que.push(next);}t = now.str;fun_B(t);k = KT(t);if(!vis[k]) {vis[k] = 1;next = now;next.step+='B';ans[k] = next.step;next.str = t;next.can = k;que.push(next);}t = now.str;fun_C(t);k = KT(t);if(!vis[k]) {vis[k] = 1;next = now;next.step+='C';ans[k] = next.step;next.str = t;next.can = k;que.push(next);}que.pop();}
}int main() {fac[0] = 1;for(int i = 1; i<10; i++)fac[i] = fac[i-1]*i;memset(vis,0,sizeof(vis));bfs();while(cin>>start>>end1) {swap(start[4],start[7]);swap(start[6],start[5]);swap(end1[4],end1[7]);swap(end1[6],end1[5]);for(int i=0; i<8; i++)pos[start[i]-'0'] = i+1;for(int i=0; i<8; i++)end1[i] = pos[end1[i]-'0'];int k;
//      cout<<KT("12345687")<<endl;k = KT(end1);cout << ans[k] << endl;}return 0;
}

魔板(康托展开去重)相关推荐

  1. HDU1430 魔板 康托展开

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

  2. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

  3. 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...

    Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...

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

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

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

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

  6. 【题解】Luogu P2730 魔板

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

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

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

  8. 魔板(洛谷-P2730)

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

  9. 魔板(信息学奥赛一本通-T1449)

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

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

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

最新文章

  1. 面试官问:线程池是如何重复利用空闲的线程来执行任务的?
  2. mybatis学习5复杂查询之多对一的处理
  3. Matlab:序列分析法MATLAB代码
  4. js里apply方法的简单实例
  5. 牛客小白月赛6 J 洋灰三角
  6. 基于C#的计时管理器
  7. selenium 示例_Selenium测试中所需的功能和示例
  8. win10调节屏幕分辨率导致黑屏
  9. 计算机系统保密检查整改情况函,保密工作整改情况汇报
  10. STM32F429第四篇之跑马灯程序详解
  11. 【OpenCV 例程 300 篇】101. 自适应中值滤波器
  12. 信息安全三分靠技术七分靠管理_ISO27001信息安全管理体系“三分靠技术 七分靠管理”...
  13. 基于stm32单片机语音LD3320控制直流电机智能座椅LCD1602显示人体重量薄膜压力传感器设计
  14. GPU服务器与CPU服务器的区别,如何选择GPU服务器
  15. 心率检测实现报告(二)
  16. java ee7教程_JavaEE 7.0 Web技术教程 -解道Jdon
  17. Java 来判断手机号码是否已经存在例子
  18. jump大乱斗维护服务器,Jump大乱斗常见问题解决方法_Jump大乱斗常见问题解决及按键设置方法_飞翔教程...
  19. 宜立方商城 搭建Maven第一天心得
  20. 《计算机网络实验教程》——验证性实验

热门文章

  1. Matlab图像处理(入门笔记)
  2. npoi导出的excel中设置列宽
  3. sin2x麦克劳林公式_sinx泰勒公式展开
  4. 计算机信息安全 概述
  5. 唯冠向苹果索赔100亿
  6. ssh远程安全访问路由器
  7. 微信公众号接口开发--回复消息
  8. android面试题之三(红黑联盟)
  9. 对学校的希望和寄语_对小学生的寄语与希望
  10. layui - 模板引擎