思路
如果两个面看到颜色不同,则这个正方体一定要被删掉
然后依次考虑每个面即可
注意坐标的映射
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char see[20][20][20],mat[20][20][20],n;
void get(int pos,int i,int j,int k,int &x,int &y,int &z){if(pos==1){x=k;y=j;z=i;}else if(pos==2){x=n-j+1;y=k;z=i;}else if(pos==3){x=n-k+1;y=n-j+1;z=i;}else if(pos==4){x=j;y=n-k+1;z=i;}else if(pos==5){x=n-i+1;y=j;z=k;}else{x=i;y=j;z=n-k+1;}
}
char get_nxt(void){char c=getchar();while(c==' '||c=='\n'||c=='\r'||c=='\0')c=getchar();return c;
}
int main(){while(scanf("%d",&n)==1&&n){memset(see,0,sizeof(see));memset(mat,0,sizeof(mat));for(int i=1;i<=n;i++){for(int j=1;j<=6;j++)for(int k=1;k<=n;k++) see[j][i][k]=get_nxt();}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)mat[i][j][k]='#';for(int i=1;i<=6;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)if(see[i][j][k]=='.')for(int p=1;p<=n;p++){int x,y,z;get(i,j,k,p,x,y,z);mat[x][y][z]='.';}while(1){int isok=true;for(int i=1;i<=6;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)if(see[i][j][k]!='.') for(int p=1;p<=n;p++){int x,y,z;get(i,j,k,p,x,y,z);if(mat[x][y][z]=='.')continue;if(mat[x][y][z]=='#'){mat[x][y][z]=see[i][j][k];break;}if(mat[x][y][z]==see[i][j][k])break;mat[x][y][z]='.';isok=false;}if(isok)break;}int ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)if(mat[i][j][k]!='.')ans++; printf("Maximum weight: %d gram(s)\n",ans);}return 0;
}