题解 迭代更新 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;
}
浙公网安备 33010602011771号