LA 3401
Posted cjwen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LA 3401相关的知识,希望对你有一定的参考价值。
彩色立方体、
【分析】
弄清楚24种状态,可以由标准姿态旋转而来。
计算24种状态:
#include <iostream> #include <string> int left[] = { 4,0,2,3,5,1 }; int up[] = { 2,1,5,0,4,3 }; //按照排列T旋转姿态p void rot(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 enumerate_permutations() { int p0[6] = { 0,1,2,3,4,5 }; printf("int dice24[24][6] = {\\n"); 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(left, p); rot(up, p); } if (i == 5) { rot(left, p); rot(left, p); rot(up, p); } for (int j = 0; j < 4; j++) { printf("{%d,%d,%d,%d,%d,%d},\\n", p[0], p[1], p[2], p[3], p[4], p[5]); rot(left, p); } } printf("};\\n"); } int main() { enumerate_permutations(); return 0; }
得到结果
直接用到最终程序中
//2019.4.23 彩色立方体 #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; const int maxn = 4; int n, dice[maxn][6], ans; int dice24[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 }, { 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 }, }; 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]]; 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 main() { while (scanf_s("%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("%s", name); dice[i][j] = ID(name); } ans = n * 6; r[0] = 0; dfs(1); printf("%d\\n", ans); } return 0; }
以上是关于LA 3401的主要内容,如果未能解决你的问题,请参考以下文章
UVaLive 3401 Colored Cubes (暴力)
bzoj3401[Usaco2009 Mar]Look Up 仰望*