zoukankan      html  css  js  c++  java
  • 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
    ",flaga);
            int lenb=strlen(b);
            //printf("%s
    ",b);
            for(int i=0; i<lenb; i++)
            {
                for(int j=0; j<lena; j++)
                {
                    if(b[i]==flaga[j])
                    {//printf("%c %c %d
    ",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;
    }
  • 相关阅读:
    字幕文件处理(2)
    使用RelativeLayout控制WebView以及Bottom按钮的位置
    使用ActionBar Tab
    使用自定的Adapter绑定ListView/GridView数据
    Mono.Android 基础
    Azure自动化实例: 复制blog用于备份
    使用C#程序处理PowerPoint文件中的字符串
    SQL语言Select经典语句
    Row_Number() and Rank() in SQL
    C# Main函数中调用异步方法的2种实现
  • 原文地址:https://www.cnblogs.com/qq136155330/p/9371362.html
Copyright © 2011-2022 走看看