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] = {
");
    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},
", p[0], p[1], p[2], p[3], p[4], p[5]);
            rot(left, p);
        }
    }
    printf("};
");
}

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 ", ans); } return 0; }
原文地址:https://www.cnblogs.com/cjwen/p/10759587.html