There are several colored cubes. All of them are of the same size but they may be colored differently. Each face of these cubes has a single color. Colors of distinct faces of a cube may or may not be the same.

Two cubes are said to be identically colored if some suitable rotations of one of the cubes give identical looks to both of the cubes. For example, two cubes shown in Figure 2 are identically colored. A set of cubes is said to be identically colored if every pair of them are identically colored.

A cube and its mirror image are not necessarily identically colored. For example, two cubes shown in Figure 3 are not identically colored.

You can make a given set of cubes identically colored by repainting some of the faces, whatever colors the faces may have. In Figure 4, repainting four faces makes the three cubes identically colored and repainting fewer faces will never do.

Your task is to write a program to calculate the minimum number of faces that needs to be repainted for a given set of cubes to become identically colored.

Input

The input is a sequence of datasets. A dataset consists of a header and a body appearing in this order. A header is a line containing one positive integer n and the body following it consists of n lines. You can assume that 1n4 . Each line in a body contains six color names separated by a space. A color name consists of a word or words connected with a hyphen (-). A word consists of one or more lowercase letters. You can assume that a color name is at most 24-characters long including hyphens.

A dataset corresponds to a set of colored cubes. The integer n corresponds to the number of cubes. Each line of the body corresponds to a cube and describes the colors of its faces. Color names in a line is ordered in accordance with the numbering of faces shown in Figure 5. A line

color1 color2 color3 color4 color5 color6

corresponds to a cube colored as shown in Figure 6.

The end of the input is indicated by a line containing a single zero. It is not a dataset nor a part of a dataset.

Figure 2: Identically colored cubes
Figure 3: cubes that are not identically colored
Figure 4: An example of recoloring
Figure 5: Numbering of faces Figure 6: Coloring

Output

For each dataset, output a line containing the minimum number of faces that need to be repainted to make the set of cub es identically colored.

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

题意:给定几个彩色立方块,求最少涂色次数使得所有立方块一样。

思路:暴力枚举,n最大4.每个立方块最多有24种摆放方式,如第一个作为参照物不用旋转,所以复杂度为O(24^3)、然后枚举过程,先把旋转方式打出表来,之后就是暴力枚举了。

代码:

#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#define INF 0x3f3f3f3f
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
using namespace std; const int left[6] = {1, 5, 2, 3, 0, 4};
const int up[6] = {3, 1, 0, 5, 4, 2}; map<string, int> vis;
map<string, int> color;
int dice24[24][6], block[4][6], ans;
int n, r[6]; void rot(const 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 dice_table() {
int n = 0;
int p0[6] = {0, 1, 2, 3, 4, 5};
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(up, p);}
if (i == 5) {rot(left, p); rot(left, p); rot(left, p); rot(up, p);}
for (int j = 0; j < 4; j ++) {
for (int k = 0; k < 6; k ++)
dice24[n][k] = p[k];
rot(left, p);
n ++;
}
}
} void init() {
vis.clear();
color.clear();
ans = INF;
int colorn = 0; char str[105];
for (int i = 0; i < n; i ++)
for (int j = 0; j < 6; j ++) {
scanf("%s", str);
if (!vis[str]) {
block[i][j] = colorn;
color[str] = colorn ++;
vis[str] = 1;
}
else block[i][j] = color[str];
}
} void check() {
int p[4][6], count = 0;
memset(p, 0, sizeof(p));
for (int i = 0; i < 6; i ++)
p[0][i] = block[0][i];
for (int i = 1; i < n; i ++) {
for (int j = 0; j < 6; j ++)
p[i][dice24[r[i]][j]] = block[i][j];
}
int color[24];
for (int i = 0; i < 6; i ++) {
memset(color, 0, sizeof(color));
for (int j = 0; j < n; j ++)
color[p[j][i]] ++;
int Max = 0;
for (int j = 0; j < 24; j ++) {
Max = max(Max, color[j]);
}
count += (n - Max);
}
ans = min(count, ans);
} void dfs(int i) {
if (i == n) {check(); return;}
for (int j = 0; j < 24; j ++) {
r[i] = j;
dfs(i + 1);
}
} void solve() {
dfs(1);
printf("%d\n", ans);
}
int main() {
dice_table();
while (~scanf("%d", &n) && n) {
init();
solve();
}
return 0;
}

1352 - Colored Cubes (枚举方法)的更多相关文章

  1. POJ2741 Colored Cubes

    Description There are several colored cubes. All of them are of the same size but they may be colore ...

  2. iOS 开发--NSMutableArray使用枚举方法

    可变数组也可以使用枚举方法, 我们在这里提供了两种枚举方法, 一个是正序枚举, 一个是倒序枚举, 在正序枚举中, 元素的个数和顺序都是不可以修改的, 但是在倒序枚举中却可以修改, 这有些耐人寻味. 涉 ...

  3. UVA 10733 - The Colored Cubes(Ploya)

    UVA 10733 - The Colored Cubes 题目链接 题意:一个立方体.n种颜色,问能涂成多少不同立方体 思路:Ploya求解,正方体相应24种不同旋转一一计算出循环个数就可以.和 U ...

  4. LA 3401 - Colored Cubes

    解题报告:有n(1<=n<=4)个立方体,每个立方体的每一个面涂有一种颜色,现在要将这些立方体的某些面的颜色重新涂一下,使得这n个立方体旋转到某一种状态下,对应的面的颜色都相同. 这题可以 ...

  5. UVALive - 3401 Colored Cubes

    好久没写解题回顾了.主要是没什么时间,但是还是一直在刷题,图论刷了70%的知识点,不过感觉长进不是很大,所以觉得还是得一步步来,最近还是先从刘汝佳大白书把前面基础章节刷完然后再决定以后的训练方式吧. ...

  6. java 前台使用枚举方法(二)

    最近发现,前台jsp使用枚举,有一个更方便的方法. 首先 枚举类的封装大家看一下:http://blog.csdn.net/hanjun0612/article/details/72845960 然后 ...

  7. java 前台使用枚举方法(一)

    枚举值封装: http://blog.csdn.net/hanjun0612/article/details/72845960 一  基本类型 这里接着说前台调用枚举值. 首先,controller层 ...

  8. uva 11825 巧妙地子集枚举方法

    https://vjudge.net/problem/UVA-11825 题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务 ...

  9. 【poj2741】 Colored Cubes

    http://poj.org/problem?id=2741 (题目链接) 题意 给出n个骰子,每一面都有一种颜色,问最少更改多少个面的颜色可以使所有骰子通过旋转后完全相同. solution 迷之d ...

随机推荐

  1. iOS开发 日常错误积累

    1.ios7 tableviewcell上面加入一个view,view上面有button,点击button不运行button的点击事件 解决的方法: self.view.userInteraction ...

  2. 记录一次SQL查询语句

    以前发现比较经典的句子,都是记录在电脑上,我今天想搬到博客上,在我看来,写博客真的是一件非常头疼的事,它是内心的一道坎,我必须得跨过它. CREATE TABLE t_jeff ( id int NO ...

  3. H-JATG:NAND_FLASH的参数设置

    JATG:NAND_FLASH     不同的cpu同一款flash:         相同的cpu不同的flash:     相同的cpu不同厂家的的flash:

  4. vim 小技巧总结

    1.v+移动光标可以选中文本. 2.y可以复制已经选中的文本 3.p可以粘贴 复制一行则:yy 复制当前光标所在的位置到行尾:y$ 复制当前光标所在的位置到行首:y^ 复制三行则:3yy,即从当前光标 ...

  5. ZOJ 3329 One Person Game 【概率DP,求期望】

    题意:有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0 设dp[i]表示达到 ...

  6. django-crispy-forms入门指南

    django-crispy-forms 是对django form在html页面呈现方式进行管理的一个第三方插件. 配置: 在INSTALLED_APPS中加入'crispy_forms' djang ...

  7. Altera FPGA中的pin进一步说明

    最近END china上的大神阿昏豆发表了博文 <FPGA研发之道(25)-管脚>,刚好今天拿到了新书<深入理解Altera FPGA应用设计>第一章开篇就讲pin.这里就两者 ...

  8. android getDecorView()的作用

    decorView是window中的最顶层view,可以从window中通过getDecorView获取到decorView.通过decorView获取到程序显示的区域,包括标题栏,但不包括状态栏.间 ...

  9. 基于visual Studio2013解决C语言竞赛题之0523魔方阵

     题目

  10. k路归并(败者树,记录败者)

          败者树在外排序中用到,每加入一个数字时,调整树需要o(lgk),比较快.外排序过程主要分为两个阶段:(1)初始化各归并段写入硬盘,初识化的方法,可利用内排序方法还可以一种叫置换选择排序的方 ...