您的位置:首页 > 其它

【uva】1352-Colored Cubes

2015-03-10 14:06 134 查看
#include<map>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 30;
const int maxd = 8;
const int INF  = 1111;
int n,cnt;
char cstr[maxn];
map<string,int>ColorList;   //颜色结合
int Cub[maxd][maxd];        //初始状态
int CubList[maxn][maxd];    //姿态集合
int Num[maxd][maxn];        //第i个面的颜色为j的数目
int ret;
void turn_left(int a[],int b[]){
    b[1] = a[2];b[2] = a[6];b[3] = a[3];
    b[4] = a[4];b[5] = a[1];b[6] = a[5];
}
void turn_on(int a[],int b[]){
    b[1] = a[4];b[2] = a[2];b[3] = a[1];
    b[4] = a[6];b[5] = a[5];b[6] = a[3];
}
void init(){
//-------------------------------------
    CubList[0][1] = 1; CubList[0][2] = 2; CubList[0][3] = 3;
    CubList[0][4] = 4; CubList[0][5] = 5; CubList[0][6] = 6;
    turn_left(CubList[0],CubList[1]);
    turn_left(CubList[1],CubList[2]);
    turn_left(CubList[2],CubList[3]);
//-------------------------------------
    turn_on(CubList[0],CubList[4]);
    turn_left(CubList[4],CubList[5]);
    turn_left(CubList[5],CubList[6]);
    turn_left(CubList[6],CubList[7]);
//--------------------------------------
    turn_on(CubList[4],CubList[8]);
    turn_left(CubList[8],CubList[9]);
    turn_left(CubList[9],CubList[10]);
    turn_left(CubList[10],CubList[11]);
//--------------------------------------
    turn_on(CubList[8],CubList[12]);
    turn_left(CubList[12],CubList[13]);
    turn_left(CubList[13],CubList[14]);
    turn_left(CubList[14],CubList[15]);
//--------------------------------------
    turn_on(CubList[1],CubList[16]);
    turn_left(CubList[16],CubList[17]);
    turn_left(CubList[17],CubList[18]);
    turn_left(CubList[18],CubList[19]);
//--------------------------------------
    turn_on(CubList[3],CubList[20]);
    turn_left(CubList[20],CubList[21]);
    turn_left(CubList[21],CubList[22]);
    turn_left(CubList[22],CubList[23]);
//--------------------------------------
}
void debug(){
    for(int i = 0; i < 24; i++){
        for(int j = 1; j <= 6; j++){
            printf("%d ,",CubList[i][j] - 1);
        }
        puts("");
    }
}
void dfs(int v){
    if(v == n){
        int _ans = 0;
        for(int i = 1; i <= 6; i++){
            int ans = 0;
            for(int j = 1; j <= cnt; j++){
                ans = max(ans,Num[i][j]);
            }
            _ans += (n - ans);
        }
        ret = min(ret,_ans);
        return;
    }
    for(int i = 0; i < 24; i++){
        Num[1][Cub[v][CubList[i][1]]]++;
        Num[2][Cub[v][CubList[i][2]]]++;
        Num[3][Cub[v][CubList[i][3]]]++;
        Num[4][Cub[v][CubList[i][4]]]++;
        Num[5][Cub[v][CubList[i][5]]]++;
        Num[6][Cub[v][CubList[i][6]]]++;
        dfs(v + 1);
        Num[1][Cub[v][CubList[i][1]]]--;
        Num[2][Cub[v][CubList[i][2]]]--;
        Num[3][Cub[v][CubList[i][3]]]--;
        Num[4][Cub[v][CubList[i][4]]]--;
        Num[5][Cub[v][CubList[i][5]]]--;
        Num[6][Cub[v][CubList[i][6]]]--;
    }
}
int main(){
    init();
//  debug();
    while(scanf("%d",&n) && n){
        ret = INF;
//      init:
        ColorList.clear();
        cnt = 1;

//      input:
        for(int i = 0; i < n; i++)
            for(int j = 1; j <= 6; j++){
            scanf("%s",cstr);
            string str(cstr);
            if(!ColorList[str]){
                ColorList[str] = cnt ++;
            }
            Cub[i][j] = ColorList[str];
        }
        memset(Num,0,sizeof(Num));
        dfs(0);
        printf("%d\n",ret);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: