UVA1030 Image Is Everything

思路

如果两个面看到颜色不同,则这个正方体一定要被删掉
然后依次考虑每个面即可
注意坐标的映射

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char see[20][20][20],mat[20][20][20],n;
void get(int pos,int i,int j,int k,int &x,int &y,int &z){
    if(pos==1){
        x=k;
        y=j;
        z=i;
    }
    else if(pos==2){
        x=n-j+1;
        y=k;
        z=i;
    }
    else if(pos==3){
        x=n-k+1;
        y=n-j+1;
        z=i;
    }
    else if(pos==4){
        x=j;
        y=n-k+1;
        z=i;
    }
    else if(pos==5){
        x=n-i+1;
        y=j;
        z=k;
    }
    else{
        x=i;
        y=j;
        z=n-k+1;
    }
}
char get_nxt(void){
    char c=getchar();
    while(c==' '||c=='\n'||c=='\r'||c=='\0')
        c=getchar();
    return c;
}
int main(){
    while(scanf("%d",&n)==1&&n){
        memset(see,0,sizeof(see));
        memset(mat,0,sizeof(mat));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=6;j++)
                for(int k=1;k<=n;k++)          
                     see[j][i][k]=get_nxt();
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                    mat[i][j][k]='#';
        for(int i=1;i<=6;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                    if(see[i][j][k]=='.')
                        for(int p=1;p<=n;p++){
                            int x,y,z;
                            get(i,j,k,p,x,y,z);
                            mat[x][y][z]='.';
                        }
        while(1){
            int isok=true;
            for(int i=1;i<=6;i++)
                for(int j=1;j<=n;j++)
                    for(int k=1;k<=n;k++)
                        if(see[i][j][k]!='.')    
                            for(int p=1;p<=n;p++){
                                int x,y,z;
                                get(i,j,k,p,x,y,z);
                                if(mat[x][y][z]=='.')
                                    continue;
                                if(mat[x][y][z]=='#'){
                                    mat[x][y][z]=see[i][j][k];
                                    break;
                                }
                                if(mat[x][y][z]==see[i][j][k])
                                    break;
                                mat[x][y][z]='.';
                                isok=false;
                            }
            if(isok)
                break;
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                    if(mat[i][j][k]!='.')
                        ans++;                       
        printf("Maximum weight: %d gram(s)\n",ans);
    }
    return 0;
}
posted @ 2019-04-16 11:14  dreagonm  阅读(172)  评论(0编辑  收藏  举报