【uva】1352-Colored Cubes

本文深入探讨了如何利用算法技术优化拼图问题,通过详细解析并实施一系列策略,成功减少了拼图完成所需步骤,提高了效率。文中详细介绍了算法的应用过程、关键步骤和优化策略,旨在为读者提供实用的技术解决方案。
#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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值