zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    vue中v-on支持的事件总结
    DateTimePicket jQuery 日期插件,开始时间和结束时间示例
    电脑C盘空间不足
    overflow text-overflow 超过部分隐藏问题
    linux中find,locate,whereis,which关系和用法
    关于jQuery中toggle参数callback函数提前执行问题
    php中的几种四舍五入取整、向上取整、向下取整、小数截取方法
    Linux中su、su -和sudo的区别
    华硕X450j清灰教程
    mysql关键字汇总
  • 原文地址:https://www.cnblogs.com/cjwen/p/10759587.html
Copyright © 2011-2022 走看看