1352 - Colored Cubes (枚举方法)
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 1n
4 . 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.




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 (枚举方法)的更多相关文章
- POJ2741 Colored Cubes
Description There are several colored cubes. All of them are of the same size but they may be colore ...
- iOS 开发--NSMutableArray使用枚举方法
可变数组也可以使用枚举方法, 我们在这里提供了两种枚举方法, 一个是正序枚举, 一个是倒序枚举, 在正序枚举中, 元素的个数和顺序都是不可以修改的, 但是在倒序枚举中却可以修改, 这有些耐人寻味. 涉 ...
- UVA 10733 - The Colored Cubes(Ploya)
UVA 10733 - The Colored Cubes 题目链接 题意:一个立方体.n种颜色,问能涂成多少不同立方体 思路:Ploya求解,正方体相应24种不同旋转一一计算出循环个数就可以.和 U ...
- LA 3401 - Colored Cubes
解题报告:有n(1<=n<=4)个立方体,每个立方体的每一个面涂有一种颜色,现在要将这些立方体的某些面的颜色重新涂一下,使得这n个立方体旋转到某一种状态下,对应的面的颜色都相同. 这题可以 ...
- UVALive - 3401 Colored Cubes
好久没写解题回顾了.主要是没什么时间,但是还是一直在刷题,图论刷了70%的知识点,不过感觉长进不是很大,所以觉得还是得一步步来,最近还是先从刘汝佳大白书把前面基础章节刷完然后再决定以后的训练方式吧. ...
- java 前台使用枚举方法(二)
最近发现,前台jsp使用枚举,有一个更方便的方法. 首先 枚举类的封装大家看一下:http://blog.csdn.net/hanjun0612/article/details/72845960 然后 ...
- java 前台使用枚举方法(一)
枚举值封装: http://blog.csdn.net/hanjun0612/article/details/72845960 一 基本类型 这里接着说前台调用枚举值. 首先,controller层 ...
- uva 11825 巧妙地子集枚举方法
https://vjudge.net/problem/UVA-11825 题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务 ...
- 【poj2741】 Colored Cubes
http://poj.org/problem?id=2741 (题目链接) 题意 给出n个骰子,每一面都有一种颜色,问最少更改多少个面的颜色可以使所有骰子通过旋转后完全相同. solution 迷之d ...
随机推荐
- 学习OpenBlas
编译 从OpenBlas Home Page 上下载源代码.make, make install 使用 level 1 向量-向量 操作 #include <iostream> #incl ...
- 关于方法的ref
没有ref的方法时: using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- 安装帝国CMS遇到“修改php.ini,将:short_open_tag 设为 On”的解决方法+“建立目录不成功!请检查目录权限”问题
想用安装个帝国CMS来做个网站,于是下载了程序,上传到服务器上,但是在输入安装路径的时候却给出了如下图示: 您的PHP配置文件php.ini配置有问题,请按下面操作即可解决: 1.修改php.ini, ...
- Ural 1068 - Sum
Your task is to find the sum of all integer numbers lying between 1 and N inclusive. Input The input ...
- WPF: 针对Windows 8优化菜单栏和工具栏
原文 WPF: 针对Windows 8优化菜单栏和工具栏 目录 1. 关于菜单图标大小 2. 关于IsEnabled和工具栏图标 3. 针对.NET 3.x的菜单栏和工具栏外观 返回目录 1. 关于菜 ...
- Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)
Gradle的官方tutorial介绍了构建Java Web应用的基本方法.不过在使用Servlet做上传的时候会碰到问题.这里分享下如何通过Servlet上传文件,以及如何使用Gradle来构建相应 ...
- Android 改变窗口标题栏的布局
Android改变窗口标题栏的布局 第一种方式 --在XML文件里面引入配置文件作为标题. 第二种方式 --动态的代码加入进去. 第三种方式(网上的): 一. 重点 一般应用的Title都是建立应 ...
- 使用线程新建WPF窗体(公用进度条窗体)
使用线程新建窗体 项目中需要一个公用的进度条窗体.大家知道在wpf中,有两个线程,一个是UI线程,另一个是监听线程(一直监听用户的输入).如果我们后台有阻塞UI线程的计算存在,那么界面上的比如进度条什 ...
- win7下wordPress本地搭建博客详解(深度亲测整理---傻瓜式详细教程)
搭建一个wordPress作为一个个人博客本来是特别简单的事情,但是网上的各种转载让初学者举步维艰,我就本身条件而言,会java EE,懂mysql都花费了我好长时间才搭建好本地博客. 注意:这个是本 ...
- wxWidgets刚開始学习的人导引(4)——wxWidgets学习资料及利用方法指导
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...