HDU 1430 魔板

魔板

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4228    Accepted Submission(s): 1003


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
 
Recommend
linle   |   We have carefully selected several similar problems for you:   1429  1426  1427  1401  1043 
 
【思路】:
如果直接按初态12345678去bfs到终态17245368,是可以得到答案的,但是
每次都进行一次bfs的话,必定会导致TLE的出现,那么我们应该怎样去优化
这个题目呢?
我们考虑是不是可以先预处理出所有情况,直接一次bfs,然后询问就可以了
那这个该如何实现了
本来初态12345678
我们可以看成位置12345678
终态对应 1724368
其实这个例子不好
换个例子
初态
数值:14567238
位置:12345678
 
终态
数值:12345678
位置:16723458
 
然后我们按位置来bfs 
就只要处理初态为12345678的bfs
然后每次去查询就可以了(手动滑稽)
就是我们将任何初态看成12345678
即那对应的位置去进行bfs,而不是拿数值
附上代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<queue>
#define mem(x) memset(x,0,sizeof(x))
using namespace std;
map<string,string>M;
const int MAXN = 10;
char flaga[MAXN];///标记12345678 对应 什么
//char flagb[MAXN];
char a[MAXN],b[MAXN];
typedef struct MYSTRING
{
    string num;
    string step;
} mystring;
string movea(string w)
{
    string temp=w;
    w[0]=temp[7];
    w[7]=temp[0];
    w[1]=temp[6];
    w[6]=temp[1];
    w[2]=temp[5];
    w[5]=temp[2];
    w[3]=temp[4];
    w[4]=temp[3];
    return w;
}
string moveb(string w)
{
    string temp=w;
    w[0]=temp[3];
    w[1]=temp[0];
    w[2]=temp[1];
    w[3]=temp[2];
    w[7]=temp[4];
    w[6]=temp[7];
    w[5]=temp[6];
    w[4]=temp[5];
    return w;
}
string movec(string w)
{
    string temp=w;
    w[5]=temp[2];
    w[6]=temp[5];
    w[1]=temp[6];
    w[2]=temp[1];
    return w;
}
queue<mystring>que;
string ans="01234567";
string result;
mystring from;
void bfs()
{
    from.num=ans;
    from.step="";
    que.push(from);
    while(!que.empty())
    {
        mystring begins=que.front();
        que.pop();
        if((M.count(begins.num)==0))
        {
            ///begins.step只能是1 2 3
            M[begins.num]=begins.step;
        }
        else
        {
            continue;
        }
        for(int i=1;i<=3;i++)
        {
            mystring ends;
            if(i==1)
            {
                ends.num=movea(begins.num);
                ends.step=begins.step+'A';
            }
            else if(i==2)
            {
                ends.num=moveb(begins.num);
                ends.step=begins.step+'B';
            }
            else if(i==3)
            {
                ends.num=movec(begins.num);
                ends.step=begins.step+'C';
            }
            que.push(ends);
        }
    }
}
int main()
{
    bfs();
   //ans=movea(ans);
   //cout<<ans<<endl;
    while(~scanf("%s %s",&a,&b))
    {
        string c;
        c.clear();
        mem(flaga);
        int lena=strlen(a);
        for(int i=0; i<lena; i++)
        {
            flaga[i]=a[i];
        }
        //printf("s=%s\n",flaga);
        int lenb=strlen(b);
        //printf("%s\n",b);
        for(int i=0; i<lenb; i++)
        {
            for(int j=0; j<lena; j++)
            {
                if(b[i]==flaga[j])
                {//printf("%c %c %d\n",b[i],flaga[j],j);
                    b[i]=j+'0';
                    break;
                }
            }
        }
        c.append(b);
        //ans=movea(ans);
        //cout<<c[1]<<endl;
        //cout<<c<<endl;
       cout<<M[c]<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/qq136155330/p/9371362.html