hdu1430(康拓展开+bfs打表)
2013-09-23 21:52
204 查看
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1430
Total Submission(s): 1527 Accepted Submission(s): 311
[align=left]Problem Description[/align]
在魔方风靡全球之后不久,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
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
[align=left]Input[/align]
每组测试数据包括两行,分别代表魔板的初态与目态。
[align=left]Output[/align]
对每组测试数据输出满足题意的变换步骤。
[align=left]Sample Input[/align]
12345678
17245368
12345678
82754631
[align=left]Sample Output[/align]
C
AC
注意:12345678 12345678 这组数据答案是输出换行符。
暴力bfs不过,打表却过了o.0。。。
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1527 Accepted Submission(s): 311
[align=left]Problem Description[/align]
在魔方风靡全球之后不久,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
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
[align=left]Input[/align]
每组测试数据包括两行,分别代表魔板的初态与目态。
[align=left]Output[/align]
对每组测试数据输出满足题意的变换步骤。
[align=left]Sample Input[/align]
12345678
17245368
12345678
82754631
[align=left]Sample Output[/align]
C
AC
注意:12345678 12345678 这组数据答案是输出换行符。
暴力bfs不过,打表却过了o.0。。。
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; bool bg[45000]; struct node{ char s[8],biao[500]; int p; }str[45000]; int jc(int a) { int k=1; for(int i=2;i<=a;i++) k*=i; return k; } void bfs() { queue<node> qi; node here,next; int bgnum,k; char st[]={"12345678"}; strcpy(here.s,st); here.p=0;str[1]=here; bg[1]=false; qi.push(here); while(!qi.empty()) { here=qi.front(); qi.pop(); next=here; next.p++; next.s[0]=here.s[7]; next.s[1]=here.s[6]; next.s[2]=here.s[5]; next.s[3]=here.s[4]; next.s[4]=here.s[3]; next.s[5]=here.s[2]; next.s[6]=here.s[1]; next.s[7]=here.s[0];bgnum=0; for(int i=0;i<7;i++) { k=0; for(int j=i+1;j<8;j++) if(next.s[i]>next.s[j]) k++; bgnum+=k*jc(7-i); }bgnum++; if(bg[bgnum]) { bg[bgnum]=false; next.biao[here.p]='A'; str[bgnum]=next; qi.push(next); } next.s[0]=here.s[3]; next.s[1]=here.s[0]; next.s[2]=here.s[1]; next.s[3]=here.s[2]; next.s[4]=here.s[5]; next.s[5]=here.s[6]; next.s[6]=here.s[7]; next.s[7]=here.s[4];bgnum=0; for(int i=0;i<7;i++) { k=0; for(int j=i+1;j<8;j++) if(next.s[i]>next.s[j]) k++; bgnum+=k*jc(7-i); }bgnum++; if(bg[bgnum]) { bg[bgnum]=false; next.biao[here.p]='B'; str[bgnum]=next; qi.push(next); } next.s[0]=here.s[0]; next.s[1]=here.s[6]; next.s[2]=here.s[1]; next.s[3]=here.s[3]; next.s[4]=here.s[4]; next.s[5]=here.s[2]; next.s[6]=here.s[5]; next.s[7]=here.s[7];bgnum=0; for(int i=0;i<7;i++) { k=0; for(int j=i+1;j<8;j++) if(next.s[i]>next.s[j]) k++; bgnum+=k*jc(7-i); }bgnum++; if(bg[bgnum]) { bg[bgnum]=false; next.biao[here.p]='C'; str[bgnum]=next; qi.push(next); } } } int main() { memset(bg,true,sizeof(bg)); bfs(); node st[3]; while(scanf("%s%s",st[0].s,st[1].s)!=EOF) { for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { if(st[1].s[j]==st[0].s[i]) { st[2].s[j]=i+1+'0'; break; } } } int bgnum=0; for(int i=0;i<7;i++) { int k=0; for(int j=i+1;j<8;j++) if(st[2].s[i]>st[2].s[j]) k++; bgnum+=k*jc(7-i); }bgnum++; for(int i=0;i<str[bgnum].p;i++) printf("%c",str[bgnum].biao[i]); printf("\n"); } return 0; }
相关文章推荐
- poj 1077 Eight 八数码问题( 康拓展开+BFS状态压缩)
- hdu1043 Eight 康拓展开+bfs打表
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
- POJ 1077 Eight(康拓展开 BFS 双向BFS)
- HDU1043:Eight HDU3567:Eight II(康拓展开+bfs搜索)
- HDOJ 题目1043 Eight(单向BFS,康拓展开,打表)
- 九数码(康拓展开+BFS)
- [kuangbin带你飞]专题二 搜索进阶 A(康拓展开+bfs)
- 康拓展开及应用
- nyoj 143 第几是谁(康拓展开的逆运算)
- 康拓展开和逆康拓展开
- POJ 1077八数码问题(cantor展开+BFS)
- 康拓展开及应用
- USACO Magic Squares, 难题,康托展开,位运算,BFS,哈希判重等……
- HDU356 Eight II(康拓展开+预处理)
- HDU 1043 Eight(A* + 奇偶剪枝 + 康拓展开)
- 蓝桥杯 2017模拟赛-本科组 排列序数(康拓展开)
- HDU 1430 魔板 康托展开或字典树 + BFS
- 康拓展开与康拓展开的逆运算
- hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)