您的位置:首页 > 其它

HDU 1430 魔板

2015-11-08 19:53 387 查看


魔板


Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)


Total Submission(s) : 29   Accepted Submission(s) : 6


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

ACM暑期集训队练习赛(三)

找到一种方案,从A->B。

预处理,将A字符串看成“12345678”,对应的将B字符串改变成对应的编号。

然后使用康托展开或者map标记都可以,储存对应结果。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<map>
using namespace std;
struct node
{
string str;
string s;
} a,b;
int len;
map<string,int>Mp;// 标记出现过的状态,并编号
string ed[60000];//储存所有对应编号的状态变化顺序
void bfs()
{
queue<node>q;
q.push(a);
while(q.size())
{
a=q.front();
q.pop();
b.str=a.str;
b.s=a.s;
//枚举所有移动方案,按字典序
b.s.append("A");
for(int i=0; i<4; i++)
swap(b.str[i],b.str[7-i]);
if(Mp[b.str]==0)
{
Mp[b.str]=len++;
ed[len-1]=b.s;
q.push(b);
}
b=a;
b.s.append("B");
for(int i=3; i>=0; i--)
{
char ch;
if(i-1>=0)
ch=a.str[i-1];
else ch=a.str[3];
b.str[i]=ch;
}
for(int i=4; i<8; i++)
{
char ch;
if(i+1<8)
ch=a.str[i+1];
else ch=a.str[4];
b.str[i]=ch;
}
if(Mp[b.str]==0)
{
Mp[b.str]=len++;
ed[len-1]=b.s;
q.push(b);
}
b=a;
b.s.append("C");
swap(b.str[1],a.str[6]);
swap(b.str[2],a.str[1]);
swap(b.str[5],a.str[2]);
swap(b.str[6],a.str[5]);
if(Mp[b.str]==0)
{
Mp[b.str]=len++;
ed[len-1]=b.s;
q.push(b);
}
}
return ;
}
int main()
{
len=1;
a.str=string("12345678");
a.s=string("");
Mp[a.str]=len++;
ed[Mp[a.str]]=a.s;
//预处理
bfs();
string c=string ("12345678");
while(cin>>a.str>>b.str)
{
for(int i=1; i<=8; i++)
{
char ch=i+'0';
for(int j=0; j<8; j++)
{
if(b.str[j]==a.str[i-1])
{
c[j]=ch;
break;
}
}
}
cout<<ed[Mp[c]]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: