UVA 1030 - Image Is Everything【模拟+思维+迭代更新】
题目链接:uva 1030 - Image Is Everything
题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给出n,然后是该立体的前、左、后、右、上和下的视图,然后判断该立体的最大体积是多少。
解题思路:首先先把所有视图上为‘.'的地方清空,然后枚举视图上不为’.'的地方,计算对应的坐标第一个不为空得位置,将其涂色(注意,若一个正方体被着两种不同的颜色,说明该位置不存在正方体)。
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10; 4 int n; 5 char pos[maxn][maxn][maxn]; 6 char view[6][maxn][maxn]; 7 char read_char() 8 { 9 char ch; 10 for(;;) 11 { 12 ch=getchar(); 13 if((ch>='A'&&ch<='Z')||ch=='.') 14 return ch; 15 } 16 } 17 void get(int k,int i,int j,int len,int &x,int &y,int &z) 18 { 19 if(k==0) 20 { 21 x=len; 22 y=j; 23 z=i; 24 } 25 if(k==1) 26 { 27 x=n-1-j; 28 y=len; 29 z=i; 30 } 31 if(k==2) 32 { 33 x=n-1-len; 34 y=n-1-j; 35 z=i; 36 } 37 if(k==3) 38 { 39 x=j; 40 y=n-1-len; 41 z=i; 42 } 43 if(k==4) 44 { 45 x=n-1-i; 46 y=j; 47 z=len; 48 } 49 if(k==5) 50 { 51 x=i; 52 y=j; 53 z=n-1-len; 54 } 55 } 56 int main() 57 { 58 while(scanf("%d",&n)!=EOF) 59 { 60 if(n==0) 61 break; 62 for(int i=0;i<n;i++) 63 { 64 for(int k=0;k<6;k++) 65 { 66 for(int j=0;j<n;j++) 67 { 68 view[k][i][j]=read_char(); 69 } 70 } 71 } 72 for(int i=0;i<n;i++) 73 { 74 for(int j=0;j<n;j++) 75 { 76 for(int k=0;k<n;k++) 77 { 78 pos[i][j][k]='#'; 79 } 80 } 81 } 82 for(int k=0;k<6;k++) 83 { 84 for(int i=0;i<n;i++) 85 { 86 for(int j=0;j<n;j++) 87 { 88 if(view[k][i][j]=='.') 89 { 90 for(int p=0;p<n;p++) 91 { 92 int x,y,z; 93 get(k,i,j,p,x,y,z); 94 pos[x][y][z]='.'; 95 } 96 } 97 } 98 } 99 } 100 for(;;) 101 { 102 bool done=true; 103 for(int k=0;k<6;k++) 104 { 105 for(int i=0;i<n;i++) 106 { 107 for(int j=0;j<n;j++) 108 { 109 if(view[k][i][j]!='.') 110 { 111 for(int p=0;p<n;p++) 112 { 113 int x,y,z; 114 get(k,i,j,p,x,y,z); 115 if(pos[x][y][z]=='.') 116 continue; 117 if(pos[x][y][z]=='#') 118 { 119 pos[x][y][z]=view[k][i][j]; 120 break; 121 } 122 if(pos[x][y][z]==view[k][i][j]) 123 break; 124 pos[x][y][z]='.'; 125 done=false; 126 } 127 } 128 } 129 } 130 } 131 if(done) 132 break; 133 } 134 int ans=0; 135 for(int i=0;i<n;i++) 136 { 137 for(int j=0;j<n;j++) 138 { 139 for(int k=0;k<n;k++) 140 { 141 if(pos[i][j][k]!='.') 142 ans++; 143 } 144 } 145 } 146 printf("Maximum weight: %d gram(s)\n",ans); 147 } 148 return 0; 149 }
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。