hdu 1430

魔板

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

给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
 
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]='';
121         hxl="";
122         for(i=0;i<8;i++)
123             hxl+=cur[i];
124         k=ktzk(hxl);
125         cout<< ans[k] <<endl;
126     }
127     return 0;
128 }
原文地址:https://www.cnblogs.com/tom987690183/p/3640672.html