using namespace std;
int L[]={ 5, 1 , 3, 4, 6, 2 };
int up[] = { 3, 2, 6, 1, 5, 4 };
void rot(int *T,int *p)
{
int q[10];
memcpy(q, p, sizeof(q));
for (int i = 0; i < 6; i++)
{
p[i] = T[q[i]-1];
}
}
int vs_main()
{
printf("dice24[24][6]={\n");
for (int i = 1; i <= 6; i++)
{
int p0[] = { 1, 2, 3, 4, 5, 6 };
if (i == 1)
{
rot(up, p0);
}
if (i == 2)
{
rot(L, p0);
rot(up, p0);
}
if (i == 3)
{
;
}
if (i == 4)
{
rot(up, p0);
rot(up, p0);
}
if (i == 5)
{
rot(L, p0);
rot(L, p0);
rot(L, p0);
rot(up, p0);
}
if (i == 6)
{
rot(L, p0);
rot(L, p0);
rot(up, p0);
}
printf("{%d,%d,%d,%d,%d,%d},", p0[0], p0[1], p0[2], p0[3], p0[4], p0[5]);
printf("\n");
for (int i = 1; i <= 3; i++)
{
rot(L, p0);
printf("{%d,%d,%d,%d,%d,%d},", p0[0], p0[1], p0[2], p0[3], p0[4], p0[5]);
printf("\n");
}
}
printf("};\n");
return 0;
}
int main()
{
int start = clock();
freopen("in.txt", "r", stdin);
//freopen("E:/out.txt","w",stdout);
printf("#===================#\n");
vs_main();
printf("#===================#\n");
printf("Time:%.3lf\n", double(clock() - start) / CLOCKS_PER_SEC);
//system("pause");
return 0;
}
#pragma warning(disable:4996)
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<map>
#include<set>
#include<sstream>
using namespace std;
int dice24[24][10] = { { 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 },
{ 1, 3, 5, 0, 2, 4 }, { 0, 3, 1, 4, 2, 5 }, { 4, 3, 0, 5, 2, 1 }, { 5, 3, 4, 1, 2, 0 }, { 3, 4, 5, 0, 1, 2 }, { 3, 5, 1, 4, 0, 2 },
{ 3, 1, 0, 5, 4, 2 }, { 3, 0, 4, 1, 5, 2 } };
const int INF = 0x3f3f3f3f;
const int maxn = 4;
int n, dice[maxn][6], ans;
vector<string> names;
int ID(const char *name)
{
string s(name);
int n = names.size();
for (int i = 0; i < n; i++)
if (names[i] == s)
return i;
names.push_back(s);
return n;
}
int r[maxn], color[maxn][6];
void check()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < 6; j++)
color[i][dice24[r[i]][j]] = dice[i][j];
int tot = 0;
for (int j = 0; j < 6; j++)
{
int cnt[maxn*6];
memset(cnt, 0, sizeof(cnt));
int maxface = 0;
for (int i = 0; i < n; i++)
maxface = max(maxface, ++cnt[color[i][j]]);
tot += n - maxface;
}
ans = min(ans, tot);
}
void dfs(int d)
{
if (d == n)check();
else for (int i = 0; i < 24; i++)
{
r[d] = i;
dfs(d + 1);
}
}
int vs_main()
{
while (scanf("%d", &n) == 1 && n)
{
names.clear();
for (int i = 0; i < n; i++)
for (int j = 0; j < 6; j++)
{
char name[30];
scanf("%s", name);
dice[i][j] = ID(name);
}
ans = n * 6;
r[0] = 0;
dfs(1);
printf("%d\n", ans);
}
return 0;
}
int main()
{
int start = clock();
freopen("in.txt", "r", stdin);
printf("#===================#\n");
vs_main();
printf("#===================#\n");
printf("Time:%.3lf\n", double(clock() - start) / CLOCKS_PER_SEC);
return 0;
}