建立一个体积为n*n*n的正方体,由六视图,删除空的小方块,然后遍历正方体,空出的地方,是否存在矛盾,并删除矛盾的方块
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
#define REP(i, n) for(int i = 0; i < (n); ++i)
const int MAXN = 10;
int n;
char pos[MAXN][MAXN][MAXN];
char view[6][MAXN][MAXN];
char read_char() { //读颜色函数
char ch;
for(;;) {
ch = getchar();
if((ch >= 'A' && ch <= 'Z') || ch == '.') {
return ch;
}
}
}
void get(int k, int i, int j, int len, int &x, int &y, int &z) {
switch (k) {
case 0: {
x = len;
y = j;
z = i;
break;
}
case 1: {
x = n - 1 - j;
y = len;
z = i;
break;
}
case 2: {
x = n - 1 - len;
y = n - 1 - j;
z = i;
break;
}
case 3: {
x = j;
y = n - 1 - len;
z = i;
break;
}
case 4: {
x = n - 1 - i;
y = j;
z = len;
break;
}
case 5: {
x = i;
y = j;
z = n - 1 - len;
break;
}
}
}
int main() {
while(scanf("%d", &n) == 1 && n) {
//读入视图
REP(i, n)//行数
REP(k, 6)//6面
REP(j, n)
view[k][i][j] = read_char();
//初始化体积
REP(i, n)
REP(j, n)
REP(k, n)
pos[i][j][k] = '#';
REP(k, 6)
REP(i, n)
REP(j, n)
if(view[k][i][j] == '.') { //此位置为空。可透视,无方块
REP(p, n) {
int x, y, z; //穿透经过的点的坐标
get(k, i, j, p, x, y, z); //平面视图变换到具体位置
pos[x][y][z] = '.'; //将该点置空
}//穿透
}
// int cnt = 0;
for(;;) {
bool done = true;
REP(k, 6)
REP(i, n)
REP(j, n) {
//cnt++;
if(view[k][i][j] != '.') {
//cout << 666 << endl;
REP(p, n) {
int x, y, z;
get(k, i, j, p, x, y, z); //平面视图变换到具体位置
if(pos[x][y][z] == '.') { //不作处理
continue;
}
if(pos[x][y][z] == '#') { //染色
pos[x][y][z] = view[k][i][j];
break;
}
if(pos[x][y][z] == view[k][i][j]) {//颜色相同
break;
}
pos[x][y][z] = '.';//颜色不同,删除该点
done = false;
}
}
}
if(done) {
break;
}
}
// cout << cnt << endl;
int ans = 0;//计算答案
REP(i, n)
REP(j, n)
REP(k, n)
if(pos[i][j][k] != '.') {
ans++;
}
printf("Maximum weight: %d gram(s)\n", ans);
}
return 0;
}