[DFS][打表]染色的立方体

2024-01-30 06:32
文章标签 立方体 dfs 打表 染色

本文主要是介绍[DFS][打表]染色的立方体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

小胖最近迷上了3D物体,尤其是立方体。他手里有很多个立方体,他想让所有的立方体全都长得一样,所以他决定给某些立方体的表面重涂颜色,使得所有的立方体完全相同。但是小胖是很懒的,他想知道最少涂多少次颜色,可以让所有立方体完全相同。

Input

输入包含多组数据,每组数据第一行n(1<=n<=4),表示立方体的数量,接下来n行,每行6个字符串,表示立方体6个面的颜色:Color 1 Color 2 Color 3 Color 4 Color 5 Color 6,中间用一个空格隔开。
其中,面的标号如下:
这里写图片描述

n=0表示输入结束。
两个立方体被视为相同,当且仅当他们可以在某种摆放方式下,每个面的颜色都对应相同。

Output

每组数据,输出一行一个整数,表示最少的涂色数。(涂一个面算一次涂色)

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个就用贪心思想求出总需涂色数
这里偷懒:用map替代hash给字符串标个号

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define rep(i,a,b) for (i=a;i<=b;i++)
using namespace std;
char c[101];
int a[5][7];
int r[5];
map<string,int> p;
int d[25][7]=
{
{0,0,0,0,0,0,0},
{0,3,2,6,1,5,4},
{0,3,1,2,5,6,4},
{0,3,5,1,6,2,4},
{0,3,6,5,2,1,4},
{0,5,3,6,1,4,2},
{0,6,3,2,5,4,1},
{0,2,3,1,6,4,5},
{0,1,3,5,2,4,6},
{0,1,2,3,4,5,6},
{0,5,1,3,4,6,2},
{0,6,5,3,4,2,1},
{0,2,6,3,4,1,5},
{0,6,2,4,3,5,1},
{0,2,1,4,3,6,5},
{0,1,5,4,3,2,6},
{0,5,6,4,3,1,2},
{0,2,4,6,1,3,5},
{0,1,4,2,5,3,6},
{0,5,4,1,6,3,2},
{0,6,4,5,2,3,1},
{0,4,5,6,1,2,3},
{0,4,6,2,5,1,3},
{0,4,2,1,6,5,3},
{0,4,1,5,2,6,3},
};
int n,i,j,l;
int ans;
void fresh()
{int p=0,rex,i,j;int cnt[25];rep(i,1,6){rep(j,0,24) cnt[j]=0;rex=0;rep(j,1,n){cnt[a[j][d[r[j]][i]]]++;rex=max(rex,cnt[a[j][d[r[j]][i]]]);}p+=n-rex;}ans=min(ans,p);
}
void dfs(int dep)
{int i;if (dep==n+1)fresh();elserep(i,1,24){r[dep]=i;dfs(dep+1);}
}
int main()
{while (1){scanf("%d",&n);ans=2147483647;if (n==0) break;p.clear();l=0;rep(i,1,n)rep(j,1,6){scanf("%s",&c);if (!p[c]){l++;p[c]=l;}a[i][j]=p[c];}r[1]=1;dfs(2);printf("%d\n",ans);}
}

这篇关于[DFS][打表]染色的立方体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659372

相关文章

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

uva 568 Just the Facts(n!打表递推)

题意是求n!的末尾第一个不为0的数字。 不用大数,特别的处理。 代码: #include <stdio.h>const int maxn = 10000 + 1;int f[maxn];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);#endif // LOCALf[0] = 1;for (int i = 1; i <=

uva 10916 Factstone Benchmark(打表)

题意是求 k ! <= 2 ^ n ,的最小k。 由于n比较大,大到 2 ^ 20 次方,所以 2 ^ 2 ^ 20比较难算,所以做一些基础的数学变换。 对不等式两边同时取log2,得: log2(k ! ) <=  log2(2 ^ n)= n,即:log2(1) + log2(2) + log2 (3) + log2(4) + ... + log2(k) <= n ,其中 n 为 2 ^

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

nyoj99(并查集+欧拉路+dfs)

单词拼接 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串。 前一个单词的结尾应该与下一个单词的道字母相同。 如 aloha dog arachnid gopher tiger rat   可以拼接成:aloha.arachnid.dog.gopher.rat.tiger 输入 第一行是一个整