UVA1030 Image Is Everything
阿新 • • 發佈:2019-04-16
映射 urn 不同 set maximum ++ imu clas pre
思路
如果兩個面看到顏色不同,則這個正方體一定要被刪掉
然後依次考慮每個面即可
註意坐標的映射
代碼
#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; }
UVA1030 Image Is Everything