【poj2741】 Colored Cubes

http://poj.org/problem?id=2741 (题目链接)

这也是道神题。。

题意:给出n个骰子,每一面都有一种颜色,问最少更改多少个面的颜色可以使所有骰子通过旋转后完全相同。

solution 
  设6个面的编号为1~6,从中选一个作为顶面,再选一个作为正面,那么其它面都可以确定(因为有对面的面也确定了),因此每个骰子有6*4=24种姿态,每种姿态对应一个全排列P,P[i]表示i所在的位置。所以我们手打这24种排列。 
  接下来看看如何暴力。我们考虑先枚举每个立方体的姿态(第一个作为“参考系”,不用枚举),然后对于6个面分别选一个出现次数最多的颜色作为“标准”,和它不同的颜色一律重新上色。那么姿态的组合一共有24³(注意第一个立方体不用枚举),算上常数,应该可以过。 
  再有就是读入的时候,将字符串全部转换成数字,方便操作。

代码:

// poj2741
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<vector>
#define LL long long
#define inf 2147483640
#define Pi 3.1415926535898
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

vector<string> names;
int dice24[24][6]= {
    {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},{1,3,5,0,2,4},{0,3,1,4,2,5},{4,3,0,5,2,1},{5,3,4,1,2,0},
    {3,4,5,0,1,2},{3,5,1,4,0,2},{3,1,0,5,4,2},{3,0,4,1,5,2},
};//24种姿态

int n,ans,dice[4][6],r[6],color[4][6];

int ID(char* name) {
    string s(name);
    int n=names.size();
    for (int i=0;i<n;i++) if (names[i]==s) return i;
    names.push_back(s);
    return n;
}
void check() {
    for (int i=0;i<n;i++)
        for (int j=0;j<6;j++) color[i][dice24[r[i]][j]]=dice[i][j];
    int tot=0;
    for (int j=0;j<6;j++) {
        int cnt[24];
        memset(cnt,0,sizeof(cnt));
        int maxface=0;
        for (int i=0;i<n;i++)
            maxface=max(maxface,++cnt[color[i][j]]);//找出每一面重复次数最多的颜色
        tot+=n-maxface;
    }
    ans=min(ans,tot);
}
void dfs(int d) {
    if (d==n) check();
    else for (int i=0;i<24;i++) {
            r[d]=i;//第d个立方体的姿态
            dfs(d+1);
        }
}
int main() {
    while (scanf("%d",&n)!=EOF && n) {
        names.clear();
        for (int i=0;i<n;i++)
            for (int j=0;j<6;j++) {//将字符串转换为数字记录
                char name[30];
                scanf("%s",name);
                dice[i][j]=ID(name);//记录第i个立方体第j个面上的颜色
            }
        ans=n*6;//赋初值为最大
        r[0]=0;
        dfs(1);
        printf("%d\n",ans);
    }
    return 0;
}

  

时间: 2024-10-10 07:18:28

【poj2741】 Colored Cubes的相关文章

【arc062e】Building Cubes with AtCoDeer

Description STL有n块瓷砖,编号从1到n,并且将这个编号写在瓷砖的正中央: 瓷砖的四个角上分别有四种颜色(可能相等可能不相等),并且用Ci,0,Ci,1,Ci,2,Ci,3分别表示左上.右上.右下.左下的颜色.颜色有1000种,编号从0到999. 现在STL想知道,从这n块瓷砖中选出不同的6块,能围成多少本质不同的合法的立方体. 一个立方体被称为合法的,当且仅当瓷砖有编号的一侧在外面,并且立方体的每个顶点处的三个颜色相同. 注意,由于瓷砖的中间是写着编号的,因此将一个瓷砖旋转90度

【POJ 2513】Colored Sticks

[POJ 2513]Colored Sticks 并查集+字典树+欧拉通路 第一次做这么混的题..太混了-- 不过题不算难 字典树用来查字符串对应图中的点 每个单词做一个点(包括重复单词 题意就是每个边走且直走一次(欧拉通路 欧拉图的判定: 没有或者只有两个奇数度的点的图叫做欧拉图 有这些就可以解答此题了 另外需要注意题目范围是25W个木棍 所以最多可能有50W个点 卡了好多个RE 代码如下: #include <iostream> #include <cstdlib> #incl

【POJ】2513 Colored Sticks

字典树+并查集. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define MAXN 500005 6 #define MAXL 11 7 #define TRIEN 26 8 9 typedef struct Trie { 10 int v; 11 Trie *next[TRIEN]; 12 Trie() { 13 v = 0; 14 for (int i=0; i<TRI

POJ2741 Colored Cubes

Description 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 id

【LeetCode】Sort Colors

LeetCode OJ Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, w

【ruby】ruby基础知识

Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for Linux tryhttp://www.rpmfind.net. Our first program(从此开始) Enter the following into the file, "test.rb". ? 1 puts "Howdy!" At the C: promp

【LeetCode】Sort Colors 解题报告

[题目] Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, a

【Unity3D】【NGUI】Atlas的动态创建

NGUI讨论群:333417608 NGUI版本:3.6.5 1.参见SZUIAtlasMakerRuntimeTest设置相应的值以上值需要提前设置好 2.没有检查是否atlas能够正确创建,自己可以改,加入返回值 3.代码都是在NGUI里面拷贝出来的,只是进行改动,没有新代码 4.适用与那种从网上下图片,之后还不想用UITexture的人,但是还是建议用UITexture如果drawcall不是问题的话 5.自己以后更新按我的方式改改就可以 6.动态创建速度较慢,建议在游戏启动的时候运行 7

企业IT管理员IE11升级指南【8】—— Win7 IE8和Win7 IE11对比

企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flash的支持 [3]—— IE11 新的GPO设置 [4]—— IE企业模式介绍 [5]—— 不跟踪(DNT)例外 [6]—— Internet Explorer 11面向IT专业人员的常见问题 [7]—— Win7和Win8.1上的IE11功能对比 [8]—— Win7 IE8和Win7 IE11对比