思路:
如果某一个视图中存在 ' . ' ,那么这一条都可以删除。
然后找出视图中每一块对应的方块并对它染色,如果一个方块先后被染上了不同的颜色,那么这个方块一定要删除。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
#define maxn 10
int n;
char a[maxn][maxn+5][maxn+5]; //视图
char b[maxn+5][maxn+5][maxn+5]; //颜色
void get(int k,int i,int j,int len,int& x,int& y,int& z) { //获取块的信息
if(k==0) x=len,y=j,z=i;
if(k==1) x=n-1-j,y=len,z=i;
if(k==2) x=n-1-len,y=n-1-j,z=i;
if(k==3) x=j,y=n-1-len,z=i;
if(k==4) x=n-1-i,y=j,z=len;
if(k==5) x=i,y=j,z=n-1-len;
}
void readin() { //读入
for(int i=0; i<n; i++)
for(int j=0; j<6; j++)
for(int k=0; k<n; k++) {
char y;
while(~scanf("%c",&y)&&!(isalpha(y)||y=='.'));
a[j][i][k]=y;
}
}
void init() { //初始化b数组
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
for(int k=0; k<n; k++)
b[i][j][k]='#';
}
void delwhole() { //整行删除
for(int k=0; k<6; k++)
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(a[k][i][j]=='.') //需要删除
for(int len=0; len<n; len++) {
int x,y,z;
get(k,i,j,len,x,y,z);
b[x][y][z]='.';
}
}
void del() { //删除
bool flag;
do {
flag=true;
for(int k=0; k<6; k++)
for(int i=0; i<n; i++)
for(int j=0; j<n; j++) {
if(a[k][i][j]=='.') continue; //这一条已经被删除
int x,y,z;
for(int len=0; len<n; len++) {
get(k,i,j,len,x,y,z);
if(b[x][y][z]=='.') continue; //已经被标记为删除
if(b[x][y][z]==a[k][i][j]) break; //被染上相同的颜色
if(b[x][y][z]=='#') { //颜色未定
b[x][y][z]=a[k][i][j];
break;
}
flag=false; //删除
b[x][y][z]='.';
}
}
} while(!flag);
}
void print() {
int ans=n*n*n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
for(int k=0; k<n; k++)
if(b[i][j][k]=='.') ans--;
printf("Maximum weight: %d gram(s)\n",ans);
}
int main() {
while(~scanf("%d",&n)&&n) {
init();
readin();
delwhole();
del();
print();
}
return 0;
}