hdu.1430.魔板(bfs + 康托展开)
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170 Accepted Submission(s): 455
1 2 3 4 8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321 B: 每行同时循环右移一格,如上图可变换为41236785 C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
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 + 康托展开)相关推荐
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu 1430 魔板
刚开始不知道有康托展开,一筹莫展,查了一下大神题解.看到说要用康托展开,遂跑去学. 康托展开:http://blog.csdn.net/zhongkeli/article/details/696680 ...
- Vijos 1029 晴天小猪历险记之Number【BFS+康托展开】
Vijos 1029 背景 话说上一回,晴天小猪不畏千难万险.千辛万苦.千磨万难--终于爬上了那座深山,来到了那位隐者的小屋中,但它不知道,有一个问题正等待着它-- 晴天小猪一推开门,就发现那里--空 ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- Magic Squares 魔板 (BFS+HASH)
Description 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8 ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- 【题解】vijos P1029 晴天小猪历险记之number(bfs 康托展开)
显然这道题可以用bfs解决.我们可以首先得到8种横竖斜之和均为15的情况,然后给它们赋予一个值,从这八种情况扩展,开一个dis数组记录某种情况所需要的步数,然后扩展出哪种就给哪种步数+1就行了.但关键 ...
- 历届试题+九宫重排+java_蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)...
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- HDU1430 魔板 康托展开
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版--魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
最新文章
- Stuts的Web.xml 详解
- AT2370 Piling Up
- hicoder - 1068 【RMQ or 线段树】
- fprintf与fwrite的区别
- “有一个产品经理的女朋友是什么体验?”
- 使用ClickOnce部署VS2005中的WinForm应用程序.(ZT)
- [js] XML与JSON有什么的区别?
- 前端学习(487):css选择器下
- mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
- 资源放送丨《 如何通过APEX实现数据库自动晨检功能 - 2020云和恩墨大讲堂》PPT视频
- “在格力干到退休,这套房就给你了!”董明珠称将投放3700套人才房…
- 华中数控预计继续亏损 拟靠关联交易增收存疑
- HTML期末作业,仿b站视频项目模板(HTML+CSS+JS)
- eps如何建立立体白模_EPS 三维测图系统(垂直摄影)快速入门手册.pdf
- python第三方模块下载方法(最详最细)
- 关于intel六代/七代CPU安装win7系统解决USB3.0驱动的镜像文件
- Sencha Touch 做相册
- git第一次提交不能使用git commit -a -m
- vscode使用方法
- JavaApplet运行