HDU 1430 魔板

魔板

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;
    }
}


你可能感兴趣的:(HDU 1430 魔板)