LA 3401 - Colored Cubes
解题报告:有n(1<=n<=4)个立方体,每个立方体的每一个面涂有一种颜色,现在要将这些立方体的某些面的颜色重新涂一下,使得这n个立方体旋转到某一种状态下,对应的面的颜色都相同。
这题可以用暴力。现在首先要研究的是一个立方体可以有多少种旋转的方式,假设经过一次旋转之后,立方体变成一种新的状态,我们把这种状态叫做姿态,题目中将每个面编了号,我们可以这样来说明一种姿态,就是说假设上面的那个面的编号为x,并且前面的那个编号为y,这样就可以唯一地确定这种姿态了,假设把题开始的那种状态向左转一次,那么
就得到上面的编号为3,前面的编号为6,这样就确定了一种姿态,这种姿态可以被描述为{5,1,3,4,6,2},按照这样的方法,很明显可以枚举出24种不同的姿态,当然,你也可以通过程序来确定这24种状态是怎么样的。列举出来的24种状态如下:
{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},{3,4,5,0,1,2},{3,5,1,4,0,2},{3,1,0,5,4,2},{3,0,4,1,5,2},
{1,3,5,0,2,4},{0,3,1,4,2,5},{4,3,0,5,2,1},{5,3,4,1,2,0}};
下一步我们就该讨论枚举这n个立方体每个立方体有24种姿态,然后分别求出每种不同的姿态需要重新涂颜色的最少的数量。可以用一个dfs来枚举出每个立方体的姿态,这样最多要枚举的次数就是24^4。然后就是如何计算每一种情况下最少应该重新涂改的颜色的个数,我们可以先分成6个面,然后计算这个可以另外写一个函数来判断,我的做法是将每个立方体的对应的面的颜色先存到一个字符串数组里面去,然后求出这些颜色里面哪一种是最多的,然后再看如果跟这个最多的颜色是不同的话就让计数器加1,最后得到的就是这个面应该修改的总的数量,然后按照同样的方式把每个面的加起来就可以了。
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
char map[][][];
int kase[][]={
{,,,,,},{,,,,,},{,,,,,},{,,,,,},{,,,,,},
{,,,,,},{,,,,,},{,,,,,},{,,,,,},{,,,,,},
{,,,,,},{,,,,,},{,,,,,},{,,,,,},{,,,,,},
{,,,,,},{,,,,,},{,,,,,},{,,,,,},{,,,,,},
{,,,,,},{,,,,,},{,,,,,},{,,,,,}};
const int MAX = 0xffffff;
int Min = MAX,n,dire[];
int panduan(char p[][]) {
int a[]={};
for(int i=;i<n;++i)
for(int j=;j<n;++j)
if(!strcmp(p[i],p[j]))
a[i]++;
int Max=;
for(int i=;i<n;++i)
if(a[i]>a[Max])
Max=i;
int tot=;
for(int i=;i<n;++i)
if(strcmp(p[i],p[Max]))
tot++;
return tot;
}
void Cube() {
int sum=;
for(int m=;m<;++m) {
char bijiao[][]; //改成动态分配内存,否则容易出错
for(int p=;p<n;++p)
strcpy(bijiao[p],map[p][kase[dire[p]][m]]);
sum += panduan(bijiao);
}
if(sum<Min)
Min = sum;
}
void dfs(int deep) {
if(deep == n-)
Cube();
else
for(int i=;i<;++i) {
dire[deep] = i;
dfs(deep+);
}
}
int main() {
while(scanf("%d",&n)&&n) {
for(int i=;i<n;++i)
for(int j=;j<;++j)
scanf("%s",map[i][j]);
Min = MAX;
dfs();
printf("%d\n",Min);
}
return ;
}
LA 3401 - Colored Cubes的更多相关文章
- UVALive 3401 - Colored Cubes 旋转 难度: 1
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- UVALive - 3401 Colored Cubes
好久没写解题回顾了.主要是没什么时间,但是还是一直在刷题,图论刷了70%的知识点,不过感觉长进不是很大,所以觉得还是得一步步来,最近还是先从刘汝佳大白书把前面基础章节刷完然后再决定以后的训练方式吧. ...
- UVaLive 3401 Colored Cubes (暴力)
题意:给定n个立方体,让你重新涂尽量少的面,使得所有立方体都相同. 析:暴力求出每一种姿态,然后枚举每一种立方体的姿态,求出最少值. 代码如下: #pragma comment(linker, &qu ...
- 1352 - Colored Cubes (枚举方法)
There are several colored cubes. All of them are of the same size but they may be colored differentl ...
- UVA 10733 - The Colored Cubes(Ploya)
UVA 10733 - The Colored Cubes 题目链接 题意:一个立方体.n种颜色,问能涂成多少不同立方体 思路:Ploya求解,正方体相应24种不同旋转一一计算出循环个数就可以.和 U ...
- POJ2741 Colored Cubes
Description There are several colored cubes. All of them are of the same size but they may be colore ...
- 【poj2741】 Colored Cubes
http://poj.org/problem?id=2741 (题目链接) 题意 给出n个骰子,每一面都有一种颜色,问最少更改多少个面的颜色可以使所有骰子通过旋转后完全相同. solution 迷之d ...
- 【codeforces 1025E】Colored Cubes 【构造】
题意 有一个n*n的棋盘和m个棋子,每个棋子有一个初始位置和一个目标位置,每次移动只能选择一个棋子移动到他相邻的格子,并且花费一秒钟.请你找出一个移动的方法,使得在10800步内将所有棋子移动到目标位 ...
- LA 3401
彩色立方体. [分析] 弄清楚24种状态,可以由标准姿态旋转而来. 计算24种状态: #include <iostream> #include <string> ,,,,, } ...
随机推荐
- 【android】TabLayout文字闪烁问题
安卓MD设计提供了一个非常酷炫的效果,TabLayout拿来做选项卡时非常合适的,但是在实际使用中发现22.2.1版本号的TabLayout在ViewPager滑动的时候会出现闪烁现象. 解决方法:在 ...
- [工具类]将时间转换为unix时间戳格式
写在前面 由于在数据库中存的时间有时间戳格式的数据,在解析以及保存的时候,就需要考虑到数据格式的兼容性问题.看到数据库中的时间字段基本上都是以时间戳格式存储的,没办法,只能将时间进行转换了,考虑到其他 ...
- AngularJs-数据绑定
前言: 我们在做前端工作最重要的是把数据能展示给用户看,展示的时候就是把数据绑定给某个元素. 1,简单的数据绑定 html: <!DOCTYPE html> <html ng-app ...
- java.lang.NoSuchFieldError: deferredExpression
处理:遇到这个异常的时候是用jstl标签,是版本问题,由于MyEclipse添加Java EE5,其中自动包括了jstl1.2的版本,lib中又存在一个jstl1.1.2的jar包,把旧版本的删掉就可 ...
- Linux进程管理工具——supervisor
介绍 Supervisord是用Python实现的一款非常实用的进程管理工具 安装 这里用源码 supervisor-.tar.gz .tar.gz cd supervisor- sudo pytho ...
- formData_html5_map标签
1 : //更省事 var files = fileInput.files; var formData = new FormData(); //将所有文件插入formData formData .ap ...
- Java-EnumSet
如下 package 集合类.Set类; /** * Set不允许重复数据 */ /** * 这个类是1.5开始有的, * 目前个人使用量几乎为零,很少使用 * 其使用方式和普通的Set没有区别,只是 ...
- Java基础-父类-子类执行顺序
代码解析 子类 package com; /** * 子类 * @author huage * */ public class Test extends Test1{ public static vo ...
- 【kAri OJ605】陈队的树
时间限制 1000 ms 内存限制 65536 KB 题目描述 陈队有N棵树,有一天他突然想修剪一下这N棵树,他有M个修剪器,对于每个修剪器给出一个高度h,表示这个修剪器可以把某一棵高度超过h的树修剪 ...
- SpringMVC中Controller和RestController
项目中的@Controller下有的是返回String类型的(比如getAllBook),有的是void的,当然,String类型是转发的页面,在void中用的是pringwrite,我今天想做一件事 ...