题目链接: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 }