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\n",ans);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(cube)