• 染色的立方体


    Description

    小胖最近迷上了3D物体,尤其是立方体。他手里有很多个立方体,他想让所有的立方体全都长得一样,所以他决定给某些立方体的表面重涂颜色,使得所有的立方体完全相同。但是小胖是很懒的,他想知道最少涂多少次颜色,可以让所有立方体完全相同。

    Input

    输入包含多组数据,每组数据第一行n(1<=n<=4),表示立方体的数量,接下来n行,每行6个字符串,表示立方体6个面的颜色:Color 1 Color 2 Color 3 Color 4 Color 5 Color 6,中间用一个空格隔开。
    其中,面的标号如下:
    这里写图片描述

    n=0表示输入结束。
    两个立方体被视为相同,当且仅当他们可以在某种摆放方式下,每个面的颜色都对应相同。
    一种涂色的方案如下:
    这里写图片描述

    Output

    每组数据,输出一行一个整数,表示最少的涂色数。(涂一个面算一次涂色)

    Sample Input

    3
    scarlet green blue yellow magenta cyan
    blue pink green magenta cyan lemon
    purple red blue yellow cyan green
    2
    red green blue yellow magenta cyan
    cyan green blue yellow magenta red
    2
    red green gray gray magenta cyan
    cyan green gray gray magenta red
    2
    red green blue yellow magenta cyan
    magenta red blue yellow cyan green
    3
    red green blue yellow magenta cyan
    cyan green blue yellow magenta red
    magenta red blue yellow cyan green
    3
    blue green green green green blue
    green blue blue green green green
    green green green green green sea-green
    3
    red yellow red yellow red yellow
    red red yellow yellow red yellow
    red red red red red red
    4
    violet violet salmon salmon salmon salmon
    violet salmon salmon salmon salmon violet
    violet violet salmon salmon violet violet
    violet violet violet violet salmon salmon
    1
    red green blue yellow magenta cyan
    4
    magenta pink red scarlet vermilion wine-red
    aquamarine blue cyan indigo sky-blue turquoise-blue
    blond cream chrome-yellow lemon olive yellow
    chrome-green emerald-green green olive vilidian sky-blue
    0

    Sample Output

    4
    2
    0
    0
    2
    3
    4
    4
    0
    16
    .
    .
    .
    .
    .
    .

    分析

    首先写出正方体有24个旋转方式,然后以第一个正方体为标准,枚举剩下n - 1个正方体的状态,然后计算最小值。
    .
    .
    .
    .
    .
    .

    程序:
    #include<iostream>
    #include<stdio.h>  
    #include<string.h> 
    using namespace std; 
    char name[30][30];  
    int n,ans,tj,c[30],s[30][30];  
    
    const int kn[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},  
    };  
    int max(int x,int y)
    {
        if (x>=y) return x; else return y;
    }
    int min(int x,int y)
    {
        if (x>=y) return y; else return x;
    }
    
    int find(char* str) 
    {  
        for (int i=0;i<tj;i++)  
        if (strcmp(name[i],str)==0) return i;  
        strcpy(name[tj],str);  
        return tj++;  
    }  
    
    void init() 
    {  
        ans=30;  
        tj=0;  
        memset(name,0,sizeof(name));  
        memset(c,0,sizeof(c));  
        char w[30];  
        for (int i=0;i<n;i++) 
        {  
            for (int j=0;j<6;j++) 
            {  
                scanf("%s",w);  
                int id=find(w);  
                s[i][j]=id;
            }  
        }  
    }  
    
    void work() 
    {  
        int v[30],sum=0;  
        for (int i=0;i<6;i++) 
        {  
            memset(v,0,sizeof(v));  
            int t=0;  
            for (int j=0;j<n;j++) 
            {    
                v[s[j][kn[c[j]][i]]]++;  
                t=max(t,v[s[j][kn[c[j]][i]]]);  
            }  
            sum+=n-t;  
        }  
        ans=min(sum,ans);  
    }  
    
    void dfs(int d) 
    {  
        if (d>=n) 
        {  
            work();  
            return;  
        }  
        for (c[d]=0;c[d]<24;c[d]++)  
        dfs(d+1);  
    }  
    
    int main() 
    {  
        cin>>n;
        while (n!=0) 
        {  
            init();  
            dfs(1);  
            cout<<ans<<endl;
            cin>>n;
        }  
        return 0;  
    }  
  • 相关阅读:
    jsoup获取文章内容
    查询数据,更新数据
    查询数据,从链接地址中爬取文章内容jsoup
    java输出一个目录下的子目录
    从多层级的目录文件中查找字符串
    Win10 x64 pnglib Release
    Win10 x64 pnglib Debug
    VS2015 dlib编译 x64 Release .lib生成
    VS2015 dlib编译 x64 Debug .lib生成
    OpenBLAS编译 Release x64 Win10 vs2015
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499947.html
Copyright © 2020-2023  润新知