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): 1917    Accepted Submission(s): 393

     

    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
     

    受不了、、WA了好久、结果映射写错了

    这题 - -、最开始直接暴力BFS、这肯定超时啊、知道超时可是还是交了一下、好吧、超内存
    这不重要、没标记的原因、加上康托展开、超时
    好吧、百度下、和八数码问题一样,先把所有情况的答案算出来,但是要有统一起点,所以讲A到B转换为12345678到C、

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <map>
    #include <string>
    using namespace std;
    #define N 326888
    
    bool vis[N];
    string dp[N];
    int fac[]={1,1,2,6,24,120,720,5040,40320,326880};
    
    struct node
    {
        string s;
        string op;
    };
    
    int Hash(string &s)   
    {
        int i,j,res=0;
        bool has[10]={0};
        for(i=0;i<9;i++)
        {
            int x=s[i]-'0',y=0;
            for(j=1;j<x;j++)
            {
                if(!has[j]) y++;
            }
            res+=y*fac[8-i];
            has[x]=1;
        }
        return res+1;
    }
    
    void BFS()
    {
        int i,j;
        node now,next;
        queue<node> q;
        memset(vis,0,sizeof(vis));
        now.s="12345678";
        now.op="";
        q.push(now);
        vis[Hash(now.s)]=1;
        while(!q.empty())
        {
            now=q.front();
            q.pop();
            dp[Hash(now.s)]=now.op;
            for(int i=1;i<=3;i++)
            {
                next=now;
                if(i==1)
                {
                    next.op+='A';
                    swap(next.s[0],next.s[7]);
                    swap(next.s[1],next.s[6]);
                    swap(next.s[2],next.s[5]);
                    swap(next.s[3],next.s[4]);
                }
                else if(i==2)
                {
                    next.op+='B';
                    char ch=next.s[3];
                    for(j=3;j>=1;j--) next.s[j]=next.s[j-1];
                    next.s[0]=ch;
                    ch=next.s[4];
                    for(j=4;j<7;j++) next.s[j]=next.s[j+1];
                    next.s[7]=ch;
                }
                else
                {
                    next.op+='C';
                    char ch=next.s[1];
                    next.s[1]=next.s[6];
                    next.s[6]=next.s[5];
                    next.s[5]=next.s[2];
                    next.s[2]=ch;
                }
                if(!vis[Hash(next.s)])
                {
                    vis[Hash(next.s)]=1;
                    q.push(next);
                }
            }
        }
    }
    int main()
    {
        BFS();
        string s1,s2;
        while(cin>>s1>>s2)
        {
            map<char,char> mp;
            for(int i=0;i<8;i++) //好吧、这儿写反了,WA- -
            {
                mp[s1[i]]=i+1+'0';
            }
            for(int i=0;i<8;i++)
            {
                s2[i]=mp[s2[i]];
            }
            cout<<dp[Hash(s2)]<<endl;
        }
        return 0;
    }
    趁着还有梦想、将AC进行到底~~~by 452181625
  • 相关阅读:
    js:语言精髓笔记1--标识符与基本类型
    ember.js:使用笔记4 数组数据的分组显示
    ember.js:使用笔记3 活用{{bind-attr}}
    ember.js:使用笔记2-数据删除与存储
    ember.js:使用笔记1-数组数据统一显示
    工具:使用jekyll生成静态网站
    css:删除:×的效果
    js写随机一个颜色
    回调函数的使用
    jquery获取select标签的选中元素
  • 原文地址:https://www.cnblogs.com/hate13/p/4071863.html
Copyright © 2011-2022 走看看