染色的立方体
Description
小胖最近迷上了3D物體,尤其是立方體。他手里有很多個立方體,他想讓所有的立方體全都長得一樣,所以他決定給某些立方體的表面重涂顏色,使得所有的立方體完全相同。但是小胖是很懶的,他想知道最少涂多少次顏色,可以讓所有立方體完全相同。
Input
輸入包含多組數(shù)據(jù),每組數(shù)據(jù)第一行n(1<=n<=4),表示立方體的數(shù)量,接下來n行,每行6個字符串,表示立方體6個面的顏色:Color 1 Color 2 Color 3 Color 4 Color 5 Color 6,中間用一個空格隔開。
其中,面的標(biāo)號如下:
n=0表示輸入結(jié)束。
兩個立方體被視為相同,當(dāng)且僅當(dāng)他們可以在某種擺放方式下,每個面的顏色都對應(yīng)相同。
一種涂色的方案如下:
Output
每組數(shù)據(jù),輸出一行一個整數(shù),表示最少的涂色數(shù)。(涂一個面算一次涂色)
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個旋轉(zhuǎn)方式,然后以第一個正方體為標(biāo)準,枚舉剩下n - 1個正方體的狀態(tài),然后計算最小值。
.
.
.
.
.
.
程序:
#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; }轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499947.html
總結(jié)