魔板

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170    Accepted Submission(s): 455

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
12345678 17245368 12345678 82754631
Sample Output
C AC

  1 #include <iostream>
  2 #include <string>
  3 #include <algorithm>
  4 #include <queue>
  5 #include<stdio.h>
  6 using namespace std ;
  7 const int MAXN = 40321; //由于此题数字1~8,康托展开的所有情况为8!,共40320种
  8 const int fac[8] = {1,1,2,6,24,120,720,5040}; //康托展开中用到的0~7的阶乘
  9 string ans[MAXN]; //存储各状态的变化步骤,预处理完成
 10 struct node
 11
 12 {
 13     int a[8];
 14     int n;
 15 } u,v;
 16 void A(node &t) //A操作
 17
 18 {
 19     std::reverse (t.a , t.a + 8) ;
 20
 21 }
 22 void B(node &t) //B操作
 23
 24 {
 25      std::rotate (t.a , t.a + 3, t.a + 4 ) ;
 26      std::rotate (t.a + 4 , t.a + 5 , t.a + 8 ) ;
 27 }
 28 void C(node &t) //C操作
 29
 30 {
 31     std::swap(t.a[1],t.a[6]);
 32     std::swap(t.a[6],t.a[5]);
 33     std::swap(t.a[5],t.a[2]);
 34
 35 }
 36 int contor(node &t) //康托展开
 37
 38 {
 39     int tmp, num = 0;
 40     for(int i=0; i<8; i++)
 41     {
 42         tmp = 0;
 43         for(int j=i+1; j<8; j++)
 44         {
 45             if(t.a[j] < t.a[i])
 46             {
 47                 tmp++;
 48
 49             }
 50
 51         }
 52         num += tmp*fac[7-i];
 53
 54     }
 55     return num;
 56
 57 }
 58 void Init(void)
 59
 60 {
 61     void (*ptr[3])(node&); //定义函数指针
 62     ptr[0] = A;
 63     ptr[1] = B;
 64     ptr[2] = C; //指向对应函数方便处理
 65
 66     int mark[MAXN] = {0}; //设置标记
 67     mark[0] = 1;
 68
 69     for(int i=0; i<8; i++) //由初始状态12345678开始
 70     {
 71         u.a[i] = i+1;
 72
 73     }
 74     u.n = contor(u);
 75
 76     queue<node>que;
 77     que.push(u);
 78     while(!que.empty())
 79     {
 80         u = que.front();
 81         que.pop();
 82         for(int i=0; i<3; i++) //三种变换
 83         {
 84             v = u;
 85             (*ptr[i])(v);
 86             v.n = contor(v); //对副本执行操作并康托展开
 87             if(mark[v.n] == 0) //重复
 88             {
 89                 char ch = 'A' + i;
 90                 ans[v.n] = ans[u.n] + ch; //记录步骤
 91
 92                 mark[v.n] = 1; //标记
 93                 que.push(v);
 94
 95             }
 96
 97         }
 98
 99     }
100
101 }
102 int main()
103
104 {
105     //freopen ("a.txt" , "r" , stdin ) ;
106     Init();
107     char a[10] = {0},b[10] = {0};
108     while(~ scanf ("%s" , a))
109     {
110         scanf ("%s" , b) ;
111         int n[10];
112         for(int i=0; i<8; i++) //把初态置换成12345678
113         {
114             n[a[i] - '0'] = i+1;
115         }
116
117         for(int i=0; i<8; i++) //把目标状态相对于初态置换
118         {
119             u.a[i] = n[b[i] - '0'];
120
121         }
122
123         cout<<ans[contor(u)]<<endl; //输出由12345678到目标态的步骤
124
125     }
126     return 0;
127 }

View Code

转载于:https://www.cnblogs.com/get-an-AC-everyday/p/4503162.html

hdu.1430.魔板(bfs + 康托展开)相关推荐

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

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

  2. hdu 1430 魔板

    刚开始不知道有康托展开,一筹莫展,查了一下大神题解.看到说要用康托展开,遂跑去学. 康托展开:http://blog.csdn.net/zhongkeli/article/details/696680 ...

  3. Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】

    Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...

  4. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  5. Magic Squares 魔板 (BFS+HASH)

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

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

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

  7. 【题解】vijos P1029 晴天小猪历险记之number(bfs 康托展开)

    显然这道题可以用bfs解决.我们可以首先得到8种横竖斜之和均为15的情况,然后给它们赋予一个值,从这八种情况扩展,开一个dis数组记录某种情况所需要的步数,然后扩展出哪种就给哪种步数+1就行了.但关键 ...

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

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

  9. HDU1430 魔板 康托展开

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

最新文章

  1. Stuts的Web.xml 详解
  2. AT2370 Piling Up
  3. hicoder - 1068 【RMQ or 线段树】
  4. fprintf与fwrite的区别
  5. “有一个产品经理的女朋友是什么体验?”
  6. 使用ClickOnce部署VS2005中的WinForm应用程序.(ZT)
  7. [js] XML与JSON有什么的区别?
  8. 前端学习(487):css选择器下
  9. mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
  10. 资源放送丨《 如何通过APEX实现数据库自动晨检功能 - 2020云和恩墨大讲堂》PPT视频
  11. “在格力干到退休,这套房就给你了!”董明珠称将投放3700套人才房…
  12. 华中数控预计继续亏损 拟靠关联交易增收存疑
  13. HTML期末作业,仿b站视频项目模板(HTML+CSS+JS)
  14. eps如何建立立体白模_EPS 三维测图系统(垂直摄影)快速入门手册.pdf
  15. python第三方模块下载方法(最详最细)
  16. 关于intel六代/七代CPU安装win7系统解决USB3.0驱动的镜像文件
  17. Sencha Touch 做相册
  18. git第一次提交不能使用git commit -a -m
  19. vscode使用方法
  20. JavaApplet运行

热门文章

  1. HTML5知识点汇总
  2. Springboot整合thymeleaf模板
  3. webpack --- 在项目中使用React
  4. Linux文本查看命令之touch
  5. 初次就这么给了你(Django-rest-framework)
  6. 重启唯一的窗体实例,以及调用系统重启函数失败解决办法
  7. YAFFS2文件系统在嵌入式LINUX系统中的应用
  8. linux设置套接字缓冲区的大小
  9. C++多线程实例(_beginThreadex创建多线程)
  10. C语言中的静态函数的作用