代码:
#include #include #include #include #define INF 0x3f3f3f3f #define min(a,b) (a)<(b) (a):(b) #define max(a,b) (a)>(b) (a):(b) using namespace std; const int left[6] = {1, 5, 2, 3, 0, 4}; const int up[6] = {3, 1, 0, 5, 4, 2}; map vis; map color; int dice24[24][6], block[4][6], ans; int n, r[6]; void rot(const int *T, int *p) { int q[6]; memcpy(q, p, sizeof(q)); for (int i = 0; i < 6; i ++) p[i] = T[q[i]]; } void dice_table() { int n = 0; int p0[6] = {0, 1, 2, 3, 4, 5}; for (int i = 0; i < 6; i ++) { int p[6]; memcpy(p, p0, sizeof(p0)); if (i == 0) rot(up, p); if (i == 1) {rot(left, p); rot(up, p);} if (i == 3) {rot(up, p); rot(up, p);} if (i == 4) {rot(left, p); rot(left, p); rot(up, p);} if (i == 5) {rot(left, p); rot(left, p); rot(left, p); rot(up, p);} for (int j = 0; j < 4; j ++) { for (int k = 0; k < 6; k ++) dice24[n][k] = p[k]; rot(left, p); n ++; } } } void init() { vis.clear(); color.clear(); ans = INF; int colorn = 0; char str[105]; for (int i = 0; i < n; i ++) for (int j = 0; j < 6; j ++) { scanf("%s", str); if (!vis[str]) { block[i][j] = colorn; color[str] = colorn ++; vis[str] = 1; } else block[i][j] = color[str]; } } void check() { int p[4][6], count = 0; memset(p, 0, sizeof(p)); for (int i = 0; i < 6; i ++) p[0][i] = block[0][i]; for (int i = 1; i < n; i ++) { for (int j = 0; j < 6; j ++) p[i][dice24[r[i]][j]] = block[i][j]; } int color[24]; for (int i = 0; i < 6; i ++) { memset(color, 0, sizeof(color)); for (int j = 0; j < n; j ++) color[p[j][i]] ++; int Max = 0; for (int j = 0; j < 24; j ++) { Max = max(Max, color[j]); } count += (n - Max); } ans = min(count, ans); } void dfs(int i) { if (i == n) {check(); return;} for (int j = 0; j < 24; j ++) { r[i] = j; dfs(i + 1); } } void solve() { dfs(1); printf("%d\n", ans); } int main() { dice_table(); while (~scanf("%d", &n) && n) { init(); solve(); } return 0; }