#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; char pos[10][10][10]; char view[6][10][10]; int n; void get(int k,int i,int j,int len,int &x,int &y,int &z) {//根据6个视图的不同性质得到x,y,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;} } char getch() { char ch; while(true) { ch=getchar(); if(ch>='A'&&ch<='Z'||ch=='.') return ch; } } int main() { while(scanf("%d",&n)!=EOF) { int i,j,k,p; if(n==0) break; for(i=0;i<n;i++) for(k=0;k<6;k++) for(j=0;j<n;j++) view[k][i][j]=getch(); for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) pos[i][j][k]='#'; for(k=0;k<6;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) if(view[k][i][j]=='.') for(p=0;p<n;p++) { int x,y,z; get(k,i,j,p,x,y,z);//根据视图获得相应点的三维坐标x,y,z pos[x][y][z]='.'; } for(;;)//每次查找找到矛盾的两个小方格,删除,直到不存在矛盾为止 { bool flag=true; for(k=0;k<6;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) if(view[k][i][j]!='.') { for(p=0;p<n;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]='.';//颜色矛盾,删除 flag=false; } } if(flag) break; } int s=0; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) if(pos[i][j][k]!='.')s++; printf("Maximum weight: %d gram(s)\n",s); } return 0; }