地址:http://acm.hdu.edu.cn/showproblem.php?pid=1430
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1527 Accepted Submission(s): 311
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
注意: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;
}