uva 1352(暴力)
2015-01-28 16:43
176 查看
题意:有n个正方体上任意涂了一些颜色,现在要改变一些正方体上的一些面上的颜色使n个正方体在某种旋转情况下可以对应面颜色相同,问最少改变多少个面的颜色。
题解:因为最多4个正方体,暴力可行,然后就是考虑24种旋转方式(当两个方向面确定,一个正方体就确定),先让一个正方体确定,根据每种旋转方式改变其它正方体的面,选出改变面的数量最少的。
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
map<string, int> m;
int n, pose[30][6], r[5], color[5][6], cube[5][6], res;
int Left[6] = {4, 0, 2, 3, 5, 1};
int up[6] = {2, 1, 5, 0, 4, 3};
void rot(int* ch, int* p) {
int q[6];
for (int i = 0; i < 6; i++)
q[i] = p[i];
for (int i = 0; i < 6; i++)
p[i] = ch[q[i]];
}
void get_pose() {
int p0[6] = {0, 1, 2, 3, 4, 5}, Count = 0;
for (int i = 0; i < 6; i++) {
int p[6];
for (int j = 0; j < 6; j++)
p[j] = p0[j];
switch(i) {
case 0: rot(up, p); break;
case 1: rot(Left, p); rot(up, p); break;
case 2: break;
case 3: rot(up, p); rot(up, p); break;
case 4: rot(Left, p); rot(Left, p); rot(Left, p); rot(up, p); break;
case 5: rot(Left, p); rot(Left, p); rot(up, p); break;
}
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 6; k++)
pose[Count][k] = p[k];
Count++;
rot(Left, p);
}
}
}
void judge() {
for (int i = 0; i < n; i++)
for (int j = 0; j < 6; j++)
color[i][pose[r[i]][j]] = cube[i][j];
int temp = 0, cnt[30];
for (int j = 0; j < 6; j++) {
memset(cnt, 0, sizeof(cnt));
int maxface = 0;
for (int i = 0; i < n; i++)
maxface = max(maxface, ++cnt[color[i][j]]);
temp += n - maxface;
}
res = min(temp, res);
}
void dfs(int cur) {
if (cur == n)
judge();
else
for (int i = 0; i < 24; i++) {
r[cur] = i;
dfs(cur + 1);
}
}
int main() {
get_pose();
while (scanf("%d", &n) && n) {
string c;
int k = 0;
m.clear();
for (int i = 0; i < n; i++)
for (int j = 0; j < 6; j++) {
cin >> c;
if (m[c])
cube[i][j] = m[c];
else
m[c] = cube[i][j] = ++k;
}
res = n * 6;
r[0] = 0;
dfs(1);
printf("%d\n", res);
}
return 0;
}
题解:因为最多4个正方体,暴力可行,然后就是考虑24种旋转方式(当两个方向面确定,一个正方体就确定),先让一个正方体确定,根据每种旋转方式改变其它正方体的面,选出改变面的数量最少的。
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
map<string, int> m;
int n, pose[30][6], r[5], color[5][6], cube[5][6], res;
int Left[6] = {4, 0, 2, 3, 5, 1};
int up[6] = {2, 1, 5, 0, 4, 3};
void rot(int* ch, int* p) {
int q[6];
for (int i = 0; i < 6; i++)
q[i] = p[i];
for (int i = 0; i < 6; i++)
p[i] = ch[q[i]];
}
void get_pose() {
int p0[6] = {0, 1, 2, 3, 4, 5}, Count = 0;
for (int i = 0; i < 6; i++) {
int p[6];
for (int j = 0; j < 6; j++)
p[j] = p0[j];
switch(i) {
case 0: rot(up, p); break;
case 1: rot(Left, p); rot(up, p); break;
case 2: break;
case 3: rot(up, p); rot(up, p); break;
case 4: rot(Left, p); rot(Left, p); rot(Left, p); rot(up, p); break;
case 5: rot(Left, p); rot(Left, p); rot(up, p); break;
}
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 6; k++)
pose[Count][k] = p[k];
Count++;
rot(Left, p);
}
}
}
void judge() {
for (int i = 0; i < n; i++)
for (int j = 0; j < 6; j++)
color[i][pose[r[i]][j]] = cube[i][j];
int temp = 0, cnt[30];
for (int j = 0; j < 6; j++) {
memset(cnt, 0, sizeof(cnt));
int maxface = 0;
for (int i = 0; i < n; i++)
maxface = max(maxface, ++cnt[color[i][j]]);
temp += n - maxface;
}
res = min(temp, res);
}
void dfs(int cur) {
if (cur == n)
judge();
else
for (int i = 0; i < 24; i++) {
r[cur] = i;
dfs(cur + 1);
}
}
int main() {
get_pose();
while (scanf("%d", &n) && n) {
string c;
int k = 0;
m.clear();
for (int i = 0; i < n; i++)
for (int j = 0; j < 6; j++) {
cin >> c;
if (m[c])
cube[i][j] = m[c];
else
m[c] = cube[i][j] = ++k;
}
res = n * 6;
r[0] = 0;
dfs(1);
printf("%d\n", res);
}
return 0;
}
相关文章推荐
- UVA 1352 Colored Cubes(暴力搜索枚举)
- uva1352 - Colored Cubes 打表+暴力
- UVA 10012 How Big Is It?(暴力枚举)
- Uva 201 Squares (暴力 + 枚举)
- UVa 1642 Magical GCD (暴力+数论)
- UVa 10534 Wavio Sequence (LIS+暴力)
- UVA 11464 Even Parity(暴力枚举)
- UVALive 4868 Palindrometer 暴力
- 例题1.8 彩色立方体 Colored Cubes UVALive - 3401 暴力打表+暴力搜索+贪心
- UVa 508 Morse Mismatches (模糊暴力)
- UVa 1595 - Symmetry【暴力枚举】
- Uva 1595 暴力枚举
- 暴力,STL,哈希技术,Floyd判圈算法(计算器谜题,uva 11549)
- UVA 725 Division(暴力枚举 简单)
- UVa 817 - According to Bartjens(暴力)
- uva 1325 - Hypertransmission(暴力枚举)
- uva 1508 - Equipment(暴力+枚举子集)
- UVA - 12325 Zombie's Treasure Chest 暴力
- uva 1352 LA3401 - Colored Cubes(模拟,4级)
- 【暴力搜索】[UVa 11212]Editing a Book