HDU 1430 魔板
来源:互联网 发布:dnf幽魂套增幅数据 编辑:程序博客网 时间:2024/05/16 18:44
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1192 Accepted Submission(s): 241
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
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
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
Source
ACM暑期集训队练习赛(三)
Recommend
linle
好长时间没有做搜索了,各种搓啊
。
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <queue>#include <stack>#include <algorithm>#include <cmath>#include <map>#define LL long long#define DB doubleusing namespace std;const int N = 40329;struct nod{ int v[8]; void out(){for(int i=0;i<8;i++) cout<<v[i]<<" ";cout<<endl;}};int fac[10]={1,1,2,6,24,120,720,5040,40320,362880};int contor(nod &t){ int i,j,tmp,num=0; for(i=0;i<8;i++) { tmp = 0; for(j=i+1;j<8;j++) if(t.v[j]<t.v[i]) tmp++; num+=fac[7-i]*tmp; }return num;}int pre[N];queue<nod> que;void op1(nod &t){ swap(t.v[0],t.v[7]); swap(t.v[1],t.v[6]); swap(t.v[2],t.v[5]); swap(t.v[3],t.v[4]);}void op2(nod &t){ swap(t.v[3],t.v[2]); swap(t.v[2],t.v[1]); swap(t.v[1],t.v[0]); swap(t.v[4],t.v[5]); swap(t.v[5],t.v[6]); swap(t.v[6],t.v[7]);}void op3(nod &t){ swap(t.v[1],t.v[6]); swap(t.v[6],t.v[5]); swap(t.v[5],t.v[2]);}string ans[N];void init(){ nod e,t; memset(pre,0,sizeof(pre)); pre[0] = 1; for(int i=0;i<8;i++) e.v[i] = i+1; que.push(e); int k; while(!que.empty()) { e = que.front(); que.pop(); int f = contor(e); t = e; op1(t); k = contor(t); if(pre[k]==0) { ans[k] = ans[f]+"A"; pre[k] = 1; que.push(t); } t = e; op2(t); k = contor(t); if(pre[k]==0) { ans[k] = ans[f]+"B"; pre[k] = 1; que.push(t); } t = e; op3(t); k = contor(t); if(pre[k]==0) { ans[k] = ans[f]+"C"; pre[k] = 1; que.push(t); } } //for(int i=0;i<8;i++) cout<<e.v[i]<<" ";cout<<endl;}int s[10];int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif init(); //ans[0]="AA"; char a[10],b[10]; nod t; while(~scanf("%s%s",a,b)) { for(int i=0;i<8;i++) { s[a[i]-'0'] = i+1; } for(int i=0;i<8;i++) { t.v[i] = s[b[i]-'0']; } //t.out(); int k = contor(t); cout<<ans[k]<<endl; } return 0;}
- HDU 1430 魔板 搜索
- HDU 1430 魔板
- HDU 1430 魔板 (BFS)
- hdu 1430 魔板
- HDU-1430 魔板
- hdu 1430 魔板
- HDU 1430 魔板
- HDU 1430 魔板
- hdu 1430+hdu 3567(预处理)
- hdu 1430 魔板 (预处理+置换+bfs)
- HDU 1430 魔板(BFS+HASH+置换)
- HDU - 1430 魔板 (bfs预处理 + 康托)
- HDU 1430+BFS
- HDU 1430 搜索
- hdu 1430 魔板(bfs+康拓展开)
- hdu 1430 魔板(bfs+预处理+康托展开)
- hdu 1430 魔板(康托展开+BFS+巧妙转换)
- HDU 1430 魔板 [BFS+康拓展开]【数学】
- .Net多线程总结(二)-BackgroundWorker
- 技术总结(转载)
- 浅谈数据库连接池
- ps比较不错的教程
- 编译speex(i386、armv6、armv7、armv7s)方法
- HDU 1430 魔板
- 中文转换为拼音
- session ,map 区别
- linux GPIO子系统组织原理及分析
- Tomcat进行卸载部署undeploy时不能删除jar文件的问题
- 在win7用u盘下安装linux ubuntu 12.10双系统安装步骤
- 【redis/lua】Lua: 给 Redis 用户的入门指导
- 登录的实现以及sessionout
- 查看linux系统启动时间