1 条题解

  • 0
    @ 2025-8-24 21:30:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 「QQ红包」
    **

    搬运于2025-08-24 21:30:15,当前版本为作者最后更新于2017-07-04 15:05:12,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    刘汝佳的训练指南上的一道题,基本上是暴搜

    24种方式打表

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<map>
    using namespace std;
    int qp[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},
    };
    map<string,int> name;
    int d;//颜色编号 
    int n,i,j;
    char ch[26];
    int ans;
    int a[5][7];//存原本颜色 
    int r[5];//存每个立方体用的姿态编号 
    int co[5][7];
    int sum[25];
    int maxx;
    void check()
    {
        for (int ii=0;ii<n;ii++)
            for (int jj=0;jj<6;jj++)
            {
                co[ii][qp[r[ii]][jj]]=a[ii][jj]; 
            }
        int t=0;
        for (int jj=0;jj<6;jj++)
        {
            memset(sum,0,sizeof(sum));//清空
            maxx=0;
            for (int ii=0;ii<n;ii++)
            {
                sum[co[ii][jj]]++;
                maxx=max(sum[co[ii][jj]],maxx);
            }
            t=t+(n-maxx);
        }
        ans=min(t,ans);
    } 
    void dfs(int x)
    {
        if (x==n) 
        {
            check();//搜完了
            return;
        }
        else 
        for (int ii=0;ii<24;ii++)//继续搜 
        {
            r[x]=ii;
            dfs(x+1);
        } 
        return;
    }
    int main()
    {
        while (scanf("%d",&n)!=EOF)
        {
            name.clear();
            d=0;
            if (n==0) return 0;
            for (i=0;i<n;i++)
                for (j=0;j<6;j++)
                {
                    scanf("%s",ch);
                    if (name[ch]==0)
                    {
                        d++;
                        name[ch]=d;
                        a[i][j]=d;//第i个立方体第j个面 颜色 标号 
                    } else a[i][j]=name[ch];
                }
            ans=n*6;//最大所有的都涂嘛
            r[0]=0;//0不旋转
            dfs(1); 
            printf("%d\n",ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    753
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者