zoukankan      html  css  js  c++  java
  • HDU 4801 Pocket Cube

    题目链接

    去年现场,虎哥1Y的,现在刷刷题,找找状态...

    一共6种转法,把3个面放到顶部,左旋和右旋,感觉写的还不错....都写成常数了。

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <queue>
    #include <algorithm>
    #define LL long long
    using namespace std;
    struct node
    {
        int num[24];
        int st;
    };
    int dr[12] = {6,2,10,7,3,0,11,8,4,1,9,5};
    int dc[12] = {5,9,1,4,8,11,0,3,7,10,2,6};
    int a[12] = {2,3,5,6,7,8,11,12,13,14,16,17};
    int b[12] = {12,13,11,16,17,14,10,18,19,15,20,21};
    int c[12] = {0,2,22,4,5,6,20,10,11,12,18,16};
    int aim[6][4] = {
                    {0,1,2,3},
                    {4,5,10,11},
                    {6,7,12,13},
                    {8,9,14,15},
                    {16,17,18,19},
                    {20,21,22,23}
                    };
    int judge(int *p)
    {
        int ans = 0,i,j;
        for(i = 0;i < 6;i ++)
        {
            for(j = 1;j < 4;j ++)
            {
                if(p[aim[i][j]] != p[aim[i][0]])
                break;
            }
            if(j == 4) ans ++;
        }
        return ans;
    }
    int main()
    {
        node u,v;
        int n,i,ans;
        while(scanf("%d",&n)!=EOF)
        {
            for(i = 0;i < 24;i ++)
            {
                scanf("%d",&u.num[i]);
            }
            u.st = 0;
            queue<node>que;
            que.push(u);
            ans = 0;
            while(!que.empty())
            {
                u = que.front();
                que.pop();
                if(ans == 6) break;
                ans = max(ans,judge(u.num));
                if(u.st == n) continue;
                v.st = u.st + 1;
                //a
                for(i = 0;i < 24;i ++)
                {
                    v.num[i] = u.num[i];
                }
                for(i = 0;i < 12;i ++)
                {
                    v.num[a[dr[i]]] = u.num[a[i]];
                }
                que.push(v);
                for(i = 0;i < 12;i ++)
                {
                    v.num[a[dc[i]]] = u.num[a[i]];
                }
                que.push(v);
                //b
                for(i = 0;i < 24;i ++)
                {
                    v.num[i] = u.num[i];
                }
                for(i = 0;i < 12;i ++)
                {
                    v.num[b[dr[i]]] = u.num[b[i]];
                }
                que.push(v);
                for(i = 0;i < 12;i ++)
                {
                    v.num[b[dc[i]]] = u.num[b[i]];
                }
                que.push(v);
                //c
                for(i = 0;i < 24;i ++)
                {
                    v.num[i] = u.num[i];
                }
                for(i = 0;i < 12;i ++)
                {
                    v.num[c[dr[i]]] = u.num[c[i]];
                }
                que.push(v);
                for(i = 0;i < 12;i ++)
                {
                    v.num[c[dc[i]]] = u.num[c[i]];
                }
                que.push(v);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    51nod 1051【基础】
    HDU5971【瞎搞】
    Lightoj1018 【状压DP】
    HDU2604【矩阵快速幂】
    HDU1501【简单DP】
    HDU3555【数位DP】
    Lightoj1037【状压DP】
    51nod 1099【贪心】
    HDU5950【矩阵快速幂】
    51nod 1049【经典】
  • 原文地址:https://www.cnblogs.com/naix-x/p/3993749.html
Copyright © 2011-2022 走看看