#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define INF 0x7f7f7f7f
#define MAXN (4+5)
#define MAXR (24+5)
vector<string> names;
int dic[24][6] = {
{2,1,5,0,4,3}, {2,0,1,4,5,3}, {2,4,0,5,1,3}, {2,5,4,1,0,3},
{4,2,5,0,3,1}, {5,2,1,4,3,0}, {1,2,0,5,3,4}, {0,2,4,1,3,5},
{0,1,2,3,4,5}, {4,0,2,3,5,1}, {5,4,2,3,1,0}, {1,5,2,3,0,4},
{5,1,3,2,4,0}, {1,0,3,2,5,4}, {0,4,3,2,1,5}, {4,5,3,2,0,1},
{3,4,5,0,1,2}, {3,5,1,4,0,2}, {3,1,0,5,4,2}, {3,0,4,1,5,2},
{1,3,5,0,2,4}, {0,3,1,4,2,5}, {4,3,0,5,2,1}, {5,3,4,1,2,0},
};
int n, n_c, r_color[MAXN][6], roun[MAXR], rd_color[MAXN][6];
int flag[MAXR];
int ans;
void init(){
names.clear();
}
void ID(int x, int y, char* pp){
int tmp = names.size();
string name(pp);
for(int i = 0; i < tmp; i++){
if(names[i] == name){
r_color[x][y] = i;
return;
}
}
names.push_back(name);
r_color[x][y] = tmp;
}
void check(){
int ret = 0;
for(int i = 0; i < 6; i++){
int ansi = 0;
memset(flag, 0, sizeof(flag));
int max_c = 0;
for(int j = 0; j < n; j++){
int tmp = rd_color[j][i];
max_c = max(max_c, ++flag[tmp]);
}
ansi += n - max_c;
ret += ansi;
}
ans = min(ans, ret);
}
void dfs(int now){
if(now == n){
check();
return;
}
for(int i = 0; i < 24; i++){
roun[now] = i;
for(int j = 0; j < 6; j++) rd_color[now][dic[i][j]] = r_color[now][j];
dfs(now+1);
}
}
int main(){
while(scanf("%d", &n) != EOF && n){
init();
n_c = 0;
for(int i = 0; i < n; i++){
char reads[MAXR];
for(int j = 0; j < 6; j++){
scanf("%s", reads);
ID(i, j, reads);
}
}
roun[0] = -1; ans = INF;
memcpy(rd_color[0], r_color[0], sizeof(rd_color));
dfs(1);
printf("%d\n", ans);
}
return 0;
}
La 3401
最新推荐文章于 2023-09-20 18:51:09 发布