思路
如果两个面看到颜色不同,则这个正方体一定要被删掉
然后依次考虑每个面即可注意坐标的映射代码
#include#include #include 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;}