题目描述
在魔方风靡全球之后不久,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
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。

输入
每组测试数据包括两行,分别代表魔板的初态与目态。

输出
对每组测试数据输出满足题意的变换步骤。

样例输入
12345678
17245368
12345678
82754631
样例输出
C
AC

#include <bits/stdc++.h>
using namespace std;
const int N = 50000 + 10;
bool vis[N];
char ans[N], prea[N], Ans[N];
int fact[11], pre[N], dis[N];struct node
{char s[10];int val;
}p, pt;
void fact_table()
{fact[0] = 1;for(int i = 1; i <= 10; i++) fact[i] = fact[i-1] * i;
}
int cantor_expansion(char *s)
{int ans = 0;int len = strlen(s);for(int i = 0; s[i]; i++){int rnk = 0;for(int j = i+1; s[j]; j++)if(s[i] > s[j]) rnk++;ans += rnk * fact[len-i-1];}return ans;
}
void bfs(char *s1)
{memset(vis, 0, sizeof vis);memset(pre, -1, sizeof pre);memset(dis, 0x3f, sizeof dis);queue<node> que;int val = cantor_expansion(s1);for(int i = 0; i < 10; i++) p.s[i] = s1[i];p.val = val;dis[p.val] = 0;que.push(p);while(! que.empty()){p = que.front(); que.pop();memcpy(pt.s, p.s, sizeof p.s);reverse(pt.s, pt.s + 8);int val = cantor_expansion(pt.s);pt.val = val;if(dis[val] > dis[p.val] + 1){dis[val] = dis[p.val] + 1;que.push(pt), pre[val] = p.val, prea[val] = 'A';}memcpy(pt.s, p.s, sizeof p.s);char tm = pt.s[3];for(int i = 2; i >= 0; i--) pt.s[i+1] = pt.s[i];pt.s[0] = tm;tm = pt.s[4];for(int i = 5; i < 8; i++) pt.s[i-1] = pt.s[i];pt.s[7] = tm;val = cantor_expansion(pt.s);pt.val = val;if(dis[val] > dis[p.val] + 1){dis[val] = dis[p.val] + 1;que.push(pt), pre[val] = p.val, prea[val] = 'B';}memcpy(pt.s, p.s, sizeof p.s);tm = pt.s[1];pt.s[1] = pt.s[6], pt.s[6] = pt.s[5], pt.s[5] = pt.s[2], pt.s[2] = tm;val = cantor_expansion(pt.s);pt.val = val;if(dis[val] > dis[p.val] + 1){dis[val] = dis[p.val] + 1;que.push(pt), pre[val] = p.val, prea[val] = 'C';}}
}
int main()
{fact_table();char s1[10], s2[10];for(int i = 0; i < 8; i++) s1[i] = i+1 + '0';s1[8] = '\0';bfs(s1);int pos[10];while(~ scanf("%s%s", s1, s2)){int k = 0;for(int i = 0; i < 8; i++) pos[s1[i]-'0'] = i+1 + '0';for(int i = 0; i < 8; i++) s2[i] = pos[s2[i]-'0'];int t = cantor_expansion(s2);while(t != 0) Ans[k++] = prea[t], t = pre[t];Ans[k] = '\0';reverse(Ans, Ans + k);printf("%s\n", Ans);}return 0;
}

1067: 【魔板】相关推荐

  1. java51游戏_Java作业实践(一)魔板游戏

    课题:魔板游戏 一.课设要求 1.基本功能 (1)游戏规则 一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断 ...

  2. P2730 魔板 Magic Squares

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

  3. 【题解】Luogu P2730 魔板

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

  4. 洛谷P2730 [IOI]魔板 Magic Squares

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

  5. Magic Squares 魔板 (BFS+HASH)

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

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

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

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

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

  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种颜色用前 ...

最新文章

  1. L-SNET:从区域定位到尺度不变的医学图像分割
  2. testing: mock object
  3. CF1140F Extending Set of Points 【按时间分治,并查集】
  4. Anaconda 查找安装的环境,以及移除旧环境命令
  5. 网易实战分享|Docker文件系统实战
  6. java的ThreadLocal类的使用方法
  7. 进程同步与互斥的区别
  8. 云计算与星辰大海的结合——不要回答,来自百亿光年外的未知信号
  9. 接力,智能指针也麻烦
  10. Node学习记录: 图片爬虫
  11. 2021PMP最全大纲内容整理
  12. 3D打印-切片软件简介
  13. SRGAN——使用与超分辨率重建的GAN
  14. 线上连锁线下整合的连锁电商架构 打造店店互推人人分销模式
  15. Papi酱: 左手奶瓶右手尿布× 左手papitube右手娱乐圈√
  16. 这款安全好用的手机浏览器,真是一股清流,值得点赞
  17. Centos服务器java环境初始化搭建
  18. Android获取系统的硬件信息、系统版本以及如何检测ROM类型
  19. 重新注册组件修复IE
  20. python将对象放入列表_将C对象添加到Python List并将C对象列表返回给python

热门文章

  1. Linux设备安装wiringPi库
  2. [ROS2]colcon build 编译选项
  3. python中List类型与numpy.array类型的互相转换
  4. 一文帮你看懂集线器、交换机、路由器的区别
  5. 领导回复下属微信“收到”,这个动作加分,不懂礼仪吃暗亏
  6. 宏狗、圣天狗、Rockey6、HASP加密锁性能体验与分析
  7. BlackHoleSwap智能合约已通过PeckShield安全审计服务
  8. ids Android xml,Android -- ids.xml文件的使用
  9. springboot中使用freemarker生成word文档并打包成zip下载(简历)
  10. Java EE初阶---网络原理之TCP_IP