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]='\0';

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 }

 

你可能感兴趣的:(HDU)