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. linux下磁盘分区

    转自于:http://pengyl.blog.51cto.com/5591604/1193963 命令:fdisk 功能:查看磁盘使用情况和分割磁盘 使用方法:                一.在 ...

  2. OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线

    上一篇 OpenGL ES 正反面设置指令 中分析了正反面的判区方法,那么正反面有什么用呢?接下来我们就要引入一个叫做背面消除的概念.在3dmax中有个选项,当你用挤压修改器挤出一个中空的长方体时,在 ...

  3. url地址传参中文乱码处理

    1.将字符串转码:new String(“xxxxx”.getBytes("iso-8859-1"),"utf-8") 这种转码方式有很大的弊端,因为它是使用指 ...

  4. web.xml的配置问题

    [转]http://perfy315.iteye.com/blog/2009258 首先 classpath是指 WEB-INF文件夹下的classes目录 ,指的就是java文件编译之后的path. ...

  5. Codeforces 489C Given Length and Sum of Digits...

    m位长度,S为各位的和 利用贪心的思想逐位判断过去即可 详细的注释已经在代码里啦~ //#pragma comment(linker, "/STACK:16777216") //f ...

  6. Qt 操作 pdf 文件

    写了好久的东西,不小心按了下返回键就没了.CSDN居然没自动保存,坑爹啊 原本还有很多信息的,现在直入正题吧. QT没有内置PDF操作的功能(其实有一个,QPrinter,不过只能写不能读,基本是半残 ...

  7. 求知成瘾+逻辑成瘾+博识的无知,你中枪没?我感觉中枪了 - 外野 - Stage1st - Powered by Discuz!

    求知成瘾+逻辑成瘾+博识的无知,你中枪没?我感觉中枪了 - 外野 - Stage1st - Powered by Discuz! 求知成瘾 求知欲似乎是人们的本能,尤其「好学」这个词被定义成天生的褒义 ...

  8. HDU 4883 TIANKENG’s restaurant (贪心)

    链接:pid=4883">带我学习.带我飞 第一次BC,稳挂,WA n多次.今天又一次做了一下 略挫 #include <iostream> #include <cs ...

  9. Hadoop伪分布式模式部署

    Hadoop的安装有三种执行模式: 单机模式(Local (Standalone) Mode):Hadoop的默认模式,0配置.Hadoop执行在一个Java进程中.使用本地文件系统.不使用HDFS, ...

  10. UNIX网络编程——网络数据包检测

    网络数据包检测 数据包捕获(sniffer):是指在网络上进行数据收集的行为,需要通过网卡来完成. 三种访问方式: BSD Packet Filter(BPF) SVR4 Datalink Provi ...