魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1649 Accepted Submission(s):
348
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
12345678
17245368
12345678
82754631
Sample Output
C
AC
Author
LL
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cstdlib> 6 #include<algorithm> 7 #include<queue> 8 using namespace std; 9 10 string start,ans[50000]; 11 int hash[10]={1}; 12 bool vis[50000]; 13 struct node 14 { 15 string c,step; 16 int val; 17 }; 18 queue<node>Q; 19 20 int ktzk(string s) 21 { 22 int i,j,sum = 0; 23 for(i = 0; i<7; i++) 24 { 25 int cnt = 0; 26 for(j = i+1; j<8; j++) 27 if(s[i]>s[j]) 28 cnt++; 29 sum+=cnt*hash[7-i]; 30 } 31 return sum; 32 } 33 void bfs() 34 { 35 node cur,now; 36 char t[10]; 37 int i,k; 38 memset(vis,false,sizeof(vis)); 39 cur.c=start; 40 cur.step=""; 41 cur.val=ktzk(start); 42 ans[cur.val]=""; 43 vis[cur.val]=true; 44 Q.push(cur); 45 while(!Q.empty()) 46 { 47 cur=Q.front(); 48 Q.pop(); 49 now=cur;//A 50 for(i=0;i<=3;i++) swap(now.c[i],now.c[7-i]); 51 52 k=ktzk(now.c); 53 if(vis[k]==false) 54 { 55 vis[k]=true; 56 now.step+='A'; 57 now.val=k; 58 ans[k]=now.step; 59 Q.push(now); 60 } 61 now=cur;//B 62 for(i=0;i<8;i++) t[i]=now.c[i]; 63 now.c[0]=t[3]; 64 now.c[1]=t[0]; 65 now.c[2]=t[1]; 66 now.c[3]=t[2]; 67 now.c[4]=t[5]; 68 now.c[5]=t[6]; 69 now.c[6]=t[7]; 70 now.c[7]=t[4]; 71 72 k=ktzk(now.c); 73 if(vis[k]==false) 74 { 75 vis[k]=true; 76 now.step+='B'; 77 now.val=k; 78 ans[k]=now.step; 79 Q.push(now); 80 } 81 now=cur; 82 for(i=0;i<8;i++) t[i]=now.c[i]; 83 now.c[1]=t[6]; 84 now.c[2]=t[1]; 85 now.c[5]=t[2]; 86 now.c[6]=t[5]; 87 k=ktzk(now.c); 88 if(vis[k]==false) 89 { 90 vis[k]=true; 91 now.step+='C'; 92 now.val=k; 93 ans[k]=now.step; 94 Q.push(now); 95 } 96 } 97 } 98 int main() 99 { 100 char a[10],b[10],cur[10]; 101 string hxl; 102 int i,j,k; 103 for(i=1;i<=8;i++) 104 hash[i]=hash[i-1]*i; 105 start="12345678"; 106 bfs(); 107 108 while(scanf("%s%s",a,b)>0) 109 { 110 for(i=0;i<8;i++) 111 { 112 for(j=0;j<8;j++) 113 { 114 if(a[i]==b[j]) 115 { 116 cur[j]='1'+i; 117 } 118 } 119 } 120 cur[8]='