#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;
}
【uva】1352-Colored Cubes
最新推荐文章于 2017-10-12 08:40:50 发布
本文深入探讨了如何利用算法技术优化拼图问题,通过详细解析并实施一系列策略,成功减少了拼图完成所需步骤,提高了效率。文中详细介绍了算法的应用过程、关键步骤和优化策略,旨在为读者提供实用的技术解决方案。

326

被折叠的 条评论
为什么被折叠?



