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 仰望*

bzoj1855||hdu3401股票交易——单调队列优化dp

hdu 3401 单调队列优化+dp

HDU 3401 Trade(单调队列优化)

hdu3401Trade