题解 迭代更新 UVA 1030
题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给出n,然后是该立体的前、左、后、右、上和下的视图,然后判断该立体的最大体积是多少。
做法:对于平面视图 首先建立函数把视图 可以将其更改为立体坐标getpos()。首先对方块进行初始化。然后把所有'.'的平面视图更新到立体坐标上。然后通过平面视图进行涂色,凡是有矛盾的方块则不存在将其取出,由于要不断更新直至不发现矛盾,所以要用while无限循环直至标志值不发生改变。最后计算所有'.'的方块。
代码:
#include <iostream> #include <cstdio> using namespace std; void getpos(int n,int k,int i,int j,int l,int& x,int& y,int& z) { if(k==0) { x=l,y=j,z=i; } else if(k==1) { y=l,z=i,x=n-1-j; } else if(k==2) { x=n-1-l,y=n-1-j,z=i; } else if(k==3) { x=j,y=n-l-1,z=i; } else if(k==4) { x=n-1-i,y=j,z=l; } else if(k==5) { x=i,y=j,z=n-l-1; } } int main() { int n;char color[15][15][15],s[15][15][15],c; while(scanf("%d",&n)&&n) { int ans=n*n*n; for(int k=0;k<n;k++) for(int i=0;i<6;i++) for(int j=0;j<n;j++) { scanf("%c",&c); if(c==' '||c=='\n') j--; else { color[i][k][j]=c; } } for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) s[i][j][k]='#'; for(int k=0;k<6;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(color[k][i][j]=='.') { int x,y,z; for(int l=0;l<n;l++) { getpos(n,k,i,j,l,x,y,z); s[x][y][z]='.'; } } } while(1) { int flag=1; for(int k=0;k<6;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(color[k][i][j]!='.') { for(int l=0;l<n;l++) { int x,y,z; getpos(n,k,i,j,l,x,y,z); if(s[x][y][z]=='.') continue; else if(s[x][y][z]=='#') { s[x][y][z]=color[k][i][j]; break; } else if(s[x][y][z]==color[k][i][j]) break; s[x][y][z]='.'; flag=0; } } } if(flag==1) break; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) if(s[i][j][k]=='.') ans--; printf("Maximum weight: %d gram(s)\n",ans); } return 0; }