1. 程式人生 > >ZOJ 3736 Pocket Cube(暴力,魔方)

ZOJ 3736 Pocket Cube(暴力,魔方)

魔方的題,暴力睡過。1930ms,差點久掛了。大笑

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#include <map>
#include <stack>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
#include <deque>

#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define PF printf
#define MM(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=a;i<b;i++) 
#define REPD(i,a,b) for(int i=a;i>b;i--)
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define bug puts("bug")
using namespace std;
#define N 25
int tun1[3][4] = {
    2,3,1,0,
    7,6,12,13,
    8,9,15,14
};
int tun2[3][8] = {
    4,5,6,7,8,9,23,22,
    3,2,5,11,16,17,14,8,
    23,21,19,17,13,7,3,1,
};

struct nod{
    int re[N];
    void in() {
        REP(i,0,24) SI(re[i]);
    }
    int cc(int a,int b,int c,int d) {
        if(re[a]==re[b]&&re[b]==re[c]&&re[c]==re[d]) return 1;
        return 0;
    }
    int get() {
        int ret =0;
        if(cc(0,1,2,3)) ret++;
        if(cc(4,5,11,10)) ret++;
        if(cc(6,7,12,13)) ret++;
        if(cc(8,9,14,15)) ret++;
        if(cc(16,17,18,19)) ret++;
        if(cc(20,21,22,23)) ret++;
        return ret;
    }
    void oor(int k) {
        int t;
        t = re[tun1[k][3]];
        REPD(i,3,0) re[tun1[k][i]] = re[tun1[k][i-1]];
        re[tun1[k][0]] = t;

        t = re[tun2[k][7]];
        REPD(i,7,0) re[tun2[k][i]] = re[tun2[k][i-1]];
        re[tun2[k][0]] = t;

        t = re[tun2[k][7]];
        REPD(i,7,0) re[tun2[k][i]] = re[tun2[k][i-1]];
        re[tun2[k][0]] = t;
    }

    void l1(int k) {
        oor(k);
    }
    void l2(int k) {
        oor(k);oor(k);
        oor(k);
    }
} ini,tmp;
int pow(int k) {
    int ret = 1;
    while(k--) {
        ret *= 6;
    }
    return ret;
}
int ans = 0;
void solve(int c,int k) {
    for(int i=0;i<c;i++) {
        int t = k%6;k/=6;
        if(t<3)
           tmp.l1(t);
        else
           tmp.l2(t-3); 
    }
    ans = max(ans,tmp.get());
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int n;
    while(~SI(n)) {
        ini.in();
        ans =0;
        for(int i=0;i<=n;i++) {
            int k = pow(i);
            for(int j=0;j<k;j++){
                tmp = ini;
                solve(i,j);
            }
        }
        PF("%d\n",ans);
    }
    return 0;
}