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 1
n
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 ...
随机推荐
- Cloud Foundry中warden的网络设计实现——iptable规则配置
在Cloud Foundry v2版本号中,该平台使用warden技术来实现用户应用实例执行的资源控制与隔离. 简要的介绍下warden,就是dea_ng假设须要执行用户应用实例(本文暂不考虑ward ...
- 如何快速方便的输出向量vector容器中不重复的内容
在vector容器中,存入的内容难免会出现重复,那么如何快速输出或提前非重复的那些数据呢,即重复的数据只输出一次,直观的方法是每次输出都要通过循环比较是否已经输出过,这种方法还是比较费时的,可以利用u ...
- CentOS 64位上编译 Hadoop 2.6.0
Hadoop不提供64位编译好的版本号,仅仅能用源代码自行编译64位版本号. 学习一项技术从安装開始.学习hadoop要从编译開始. 1.操作系统编译环境 yum install cmake lzo- ...
- ListView下拉刷新及上拉更多两种状态
一.前言: 很多应用都会用到ListView,当然如果是iOS就会用UITableViewController,这两个控件在不同的OS上,功能是一样的,只是有些细微的不同(iOS的UITableVie ...
- G - I Think I Need a Houseboat(简单题,粘贴下来是因为数据精度需要注意)
These will be floating point numbers:看这句话,就是说数据会是浮点型的, 问题(一)数据定义成double类型就过了 我当时以为定义成float类型就可以了, 因为 ...
- Python获取并修改hosts
#!/usr/bin/env python #-*- coding: utf-8 -*- #谷歌host修改脚本 #author 坤子<root#pythonpy.com> #date 0 ...
- 如何借助Motion操控Linux监控摄像头
介绍 本文介绍如何使用motion来操控Linux下的摄像头. 安装 apt-get install motion 配置文件 输入命令后面的命令编辑配置文件, vim /etc/motion/moti ...
- HDU 4891
一道简单的模拟题 需要要匹配{} 和 $$ 符里面的东西即可 //#pragma comment(linker, "/STACK:16777216") //for c++ Comp ...
- form的验证用法
models.py forms.py html页面 第二种方法: 不继承model直接自定义内容 获得内容: if form.is_valid(): price = reques ...
- ORACLE存储过程笔记3
ORACLE存储过程笔记3 流程控制 1.条件 if expression thenpl/sql or sqlend if; if expression thenpl/sql or sqlel ...