题解 迭代更新 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;
}

posted on 2014-11-20 16:18  一锅土豆  阅读(180)  评论(0编辑  收藏  举报