zoukankan      html  css  js  c++  java
  • HDU 5836 Rubik's Cube BFS

    Rubik's Cube

    题目连接:

    http://acm.hdu.edu.cn/showproblem.php?pid=5836

    Description

    As we all know, Zhu is the wisest man. When Liao was ninety-nine years old, the Zhu appeared to him and said, "I am God Almighty; walk before me and be blameless.

    I will confirm my covenant between me and you and will greatly increase your wisdom." At that time, Liao has a problem:

    Liao has a Rubik's Cube and the surfaces of it are drawn as black or white. He can rotate it as the rules of the Rubik's Cube. Liao asked Zhu:"how many states the Rubik's Cube can reach?"

    Zhu is omniscient and omnipotent, but he did not tell the answer. Can you tell the poor man the answer? Remember two states are regarded as the same one if you change views and find the two states is the same one.

    For those of you unfamiliar with the puzzle, a Rubik's Cube, comes in the form of a cube where each face is divided into three rows and three columns (nine "squares". Any of the six faces of the cube may be rotated either clockwise or counterclockwise, which also rotates the three nearest squares on each adjoining face onto a new face, respectively.

    Input

    Intput contains multiple test cases.

    The first line is an integer 1≤T≤10, the number of test cases.

    Each case begins with an integer n, indicating the number of the squares of blacks.

    The next line contains n integers a1,a2,..,an, representing squares indexed as a1,a2,..,an are black respectively. All ai are defferent. The indexes of squares are showed in the pictures. (0≤n≤5,0≤ai≤53).

    Output

    For each test case,output a single line "Case #x: y", where x is the case number, starting from 1. And y is the answer.

    Sample Input

    3
    2
    0 47
    2
    24 53
    2
    36 46

    Sample Output

    Case #1: 15
    Case #2: 15
    Case #3: 24

    Hint

    题意

    给你一个魔方,告诉你这个魔方有一些格子是黑色的,问你这个魔方旋转之后能够得到多少个不同的魔方。

    就是不同的要,完全不同。

    就旋转相同,也算相同。

    题解:

    XJB搜,你需要买一个魔方,然后XJB转一下 ,看看转移是什么样的,当然你有强大的脑补能力也可以……

    然后就完了……

    代码

    //by Atlantis67
    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    int f[4][54]={
                    {2,5,8,1,4,7,0,3,6,
                   36,37,38,12,13,14,15,16,17,
                   9,10,11,21,22,23,24,25,26,
                   18,19,20,30,31,32,33,34,35,
                   27,28,29,39,40,41,42,43,44,
                   45,46,47,48,49,50,51,52,53},
    
                    {6,3,0,7,4,1,8,5,2,
                   18,19,20,21,22,23,24,25,26,
                   27,28,29,30,31,32,33,34,35,
                   36,37,38,39,40,41,42,43,44,
                   9,10,11,12,13,14,15,16,17,
                   47,50,53,46,49,52,45,48,51},
    
                    {29,32,35,28,31,34,27,30,33,
                     2,5,8,1,4,7,0,3,6,
                     20,23,26,19,22,25,18,21,24,
                     47,50,53,46,49,52,45,48,51,
                     42,39,36,43,40,37,44,41,38,
                     11,14,17,10,13,16,9,12,15},
    
                     {18,19,20,21,22,23,24,25,26,
                      11,14,17,10,13,16,9,12,15,
                      45,46,47,48,49,50,51,52,53,
                      33,30,27,34,31,28,35,32,29,
                      8,7,6,5,4,3,2,1,0,
                      44,43,42,41,40,39,38,37,36}
                    };
    
    set<LL> s;
    LL duilie[10000000];
    int tot=0;
    void pri(LL a,LL b,int ha)
    {
        printf("================
    ");
        for (int j=0;j<54;j++) if ((a>>j)&1) printf("%d ",j);puts("");
        for (int j=0;j<54;j++) if ((b>>j)&1) printf("%d ",j);puts("");
        printf("%d
    ",ha);
        getchar();
    }
    void BFS(LL first)
    {
        int fron=0,rear=1;
        duilie[0]=first;
        s.insert(first);
        while (fron<rear){
            LL now=duilie[fron];
            for (int k=0;k<4;k++){
                LL next=0;
                for (int j=0;j<54;j++) {
                    if ((now>>j)&1)
                        next|=(1LL<<f[k][j]);
                }
                if (s.find(next)==s.end()) {
                    //pri(now,next,k);
                    duilie[rear++]=next;
                    s.insert(next);
                }
            }
            fron++;
        }
        tot=rear;
    }
    LL w[100];
    set<LL> si;
    int wtot;
    void gao(LL first)
    {
        si.clear();wtot=0;
        int fron=0,rear=1;
        w[0]=first;
        si.insert(first);
        while (fron<rear){
            LL now=w[fron];
            for (int k=1;k<4;k++){
                LL next=0;
                for (int j=0;j<54;j++) {
                    if ((now>>j)&1)
                        next|=(1LL<<f[k][j]);
                }
                if (si.find(next)==si.end()) {
                    w[rear++]=next;
                    si.insert(next);
                }
            }
            fron++;
        }
        wtot=rear;
    }
    int suan()
    {
        int ans=0;
        for (int j=0;j<tot;j++){
            if (s.find(duilie[j])!=s.end()){
                gao(duilie[j]);
                for (int k=0;k<wtot;k++) s.erase(w[k]);
                assert(24%wtot==0);
                ans++;
            }
        }
        return ans;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        int t=T;
        while (T--){
            int n;
            scanf("%d",&n);
            LL first=0;
            for (int j=0;j<n;j++){
                int g;
                scanf("%d",&g);
                first|=(1LL<<g);
            }
            //cout<<first<<endl;
            s.clear();tot=0;
            BFS(first);
            printf("Case #%d: %d
    ",t-T,suan());
        }
        return 0;
    }
  • 相关阅读:
    Flex Box 简单弹性布局
    CSS 0.5px 细线边框的原理和实现方式
    前端模块化方案全解(CommonJS/AMD/CMD/ES6)
    用信鸽来讲解HTTPS的知识
    __name__ == "__main__"的作用是什么?
    如何自学计算机科学与技术(Teach Yourself Computer Science)
    中文技术文档的写作规范
    'adb remount'的作用是什么?在什么情况下有用?
    使用python遍历文件夹取出特定的字符串
    Python&Appium实现安卓手机图形解锁
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5771246.html
Copyright © 2011-2022 走看看