• 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=='
    '||c=='
    '||c=='')
            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)
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    cd的使用
    转换器模式
    装饰模式
    策略模式
    模板方法模式
    工厂模式
    类型信息
    proto编译组件使用
    proto编译引用外部包问题
    Kafka经典三大问:数据有序丢失重复
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10715747.html
Copyright © 2020-2023  润新知