• UVA 1030


    题目链接: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)
    ",ans);
    147     }
    148     return 0;
    149 }
  • 相关阅读:
    数据结构--线性表顺序存储(顺序表)
    图论--双连通分量--点双连通模板
    C++ 模板(template) 的定义
    图论--网络流--最大流 HDU 2883 kebab(离散化)
    图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)
    图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)
    图论--网络流--最大流--POJ 1698 Alice's Chance
    CodeForces 709C Letters Cyclic Shift
    CodeForces 709B Checkpoints
    CodeForces 709A Juicer
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7204655.html
Copyright © 2020-2023  润新知