[ACM_模拟][ACM_数学] LA 2995 Image Is Everything [由6个视图计算立方体最大体积]

简介:


 

Description

 

Your new company is building a robot that can hold small lightweight objects. The robot will have the intelligence to determine if an object is light enough to hold. It does this by taking pictures of the object from the 6 cardinal directions, and then inferring an upper limit on the object's weight based on those images. You must write a program to do that for the robot.

You can assume that each object is formed from an N×N×N lattice of cubes, some of which may be missing. Each 1×1×1 cube weighs 1 gram, and each cube is painted a single solid color. The object is not necessarily connected.

 

Input

The input for this problem consists of several test cases representing different objects. Every case begins with a line containing  N, which is the size of the object (  1$ \le$N$ \le$10). The next  N lines are the different  N×N views of the object, in the order front, left, back, right, top, bottom. Each view will be separated by a single space from the view that follows it. The bottom edge of the top view corresponds to the top edge of the front view. Similarly, the top edge of the bottom view corresponds to the bottom edge of the front view. In each view, colors are represented by single, unique capital letters, while a period (  .) indicates that the object can be seen through at that location.

Input for the last test case is followed by a line consisting of the number 0.

 

Output

For each test case, print a line containing the maximum possible weight of the object, using the format shown below.

 

Sample Input

3
.R. YYR .Y. RYY .Y. .R.
GRB YGR BYG RBY GYB GRB
.R. YRR .Y. RRY .R. .Y.
2
ZZ ZZ ZZ ZZ ZZ ZZ
ZZ ZZ ZZ ZZ ZZ ZZ
0

 

Sample Output

Maximum weight: 11 gram(s)
Maximum weight: 8 gram(s)


题目大意:nxnxn立方体,其中一些单位立方体已经缺失(剩下的部分不一定联通)。每个立方体重量为1克,且被图上单一的颜色(即6个面颜色相同)。给出前左后右顶底6个视图,判断这个物体的最大质量。输入包含多组数据,每组数据的第一行为一个整数n;以下n行每行从左往右依次为前左后右顶底6个视图,每个视图占n列。在每一列大写字母表示颜色(不同字母表示不同颜色),句号(.)表示可以看穿(即没有任何立方体)。输入n=0结束
解题思路:看了刘汝佳算法书上的讲解有点晕,于是在网上找了一个人家的讲解才真正明白!本题用的是迭代更新法[这个方法是个很好的解题思路:先弄一个死循环,每次根据上一次状态更新下一次状态,这样可以从一点线索找到全部线索[比如扫雷],然后如果连续2次状态没有改变,那么就说明不会产生新的线索啦,也就结束运算。]对于这一题用下列方法更新状态:

  1. 进行循环,每次循环对立方体的六个视图进行遍历

  2. 遍历一个视图时,对视图上的每个位置,计算出对应立方体上那一排的每个坐标.

  3. 对每个坐标,判断: 

      a. 如果这个坐标的单位立方体为空,跳过,否则b 

      b. 如果这个坐标的单位立方体没有上色,将它涂上这个视图对应位置的颜色,否则c

      c. 如果单位立方体上色了,判断这个颜色和该视图对应位置颜色是否相同,如果不同说明出现矛盾,这个单位立方体不存在,标为空;如果相同暂定为存在.

  4. 如果六个视图遍历完后没有删除一个单位立方体,循环结束.否则重新遍历六个视图.

  5. 对立方体的每个单位立方体进行遍历,除掉不存在的单位立方体,计算出重量.

 

复制代码
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define REP(i,n) for(int i=0;i<(n);i++)
 8 
 9 const int maxn=10;
10 int n;
11 char pos[maxn][maxn][maxn];
12 char view[6][maxn][maxn];
13 
14 char read_char(){
15     char ch;
16     for(;;){
17         ch=getchar();
18         if((ch>='A' && ch<='Z') || ch=='.')return ch;
19     }
20 }
21 void get(int k,int i,int j,int len,int &x,int &y,int &z){
22     switch(k){
23         case 0:x=len;y=j;z=i;break;
24         case 1:x=n-1-j;y=len;z=i;break;
25         case 2:x=n-1-len;y=n-1-j;z=i;break;
26         case 3:x=j;y=n-1-len;z=i;break;
27         case 4:x=n-1-i;y=j;z=len;break;
28         case 5:x=i;y=j;z=n-1-len;break;
29     }
30 }//表示第k个视图中,第i行第j列、深度为len单位立方体在原立方体中的坐标(x,y,z)
31 int main(){
32     while(cin>>n && n){
33         REP(i,n)REP(k,6)REP(j,n)view[k][i][j]=read_char();
34         REP(i,n)REP(j,n)REP(k,n)pos[i][j][k]='#';
35         // 如果视图这个位置为空,可以看穿,说明这排是没有单位立方体的.全部标为空.  
36         REP(k,6)REP(i,n)REP(j,n)if(view[k][i][j]=='.'){
37             REP(p,n){
38                 int x,y,z;
39                 get(k,i,j,p,x,y,z);
40                 pos[x][y][z]='.';
41             }
42         }
43         // 不断重复地扫描六个面.将没被删除的格子进行染色.  
44         for(;;){
45             bool done=true;
46             REP(k,6)REP(i,n)REP(j,n)if(view[k][i][j]!='.'){
47                 REP(p,n){
48                     int x,y,z;
49                     get(k,i,j,p,x,y,z);
50                     if(pos[x][y][z]=='.')continue;// 如果是'.',那么这个格子已经被删除掉了,跳过 
51                     if(pos[x][y][z]=='#'){// 如果没染过色,进行染色. 
52                         pos[x][y][z]=view[k][i][j];
53                         break;
54                     }
55                     if(pos[x][y][z]==view[k][i][j])break;// 两个视图看到的颜色一样.暂定为存在 
56                     else{// 两个视图看到的颜色不一样,说明不存在,删掉这个单位立方体.  
57                         pos[x][y][z]='.';
58                         done=false;
59                     }
60                 }
61             }
62             if(done)break;// 如果遍历六个视图后没有删掉一个单位立方体,可以结束循环.  
63         }
64 
65         int ans=0;// 计算重量 
66         REP(i,n)REP(j,n)REP(k,n)
67             if(pos[i][j][k]!='.')ans++;
68 
69         printf("Maximum weight: %d gram(s)\n",ans);
70     }return 0;
71 }
复制代码
相关文章
|
7月前
|
计算机视觉
Google Earth Engine(GEE)——使用MODIS数据单点测试SG滤波和harmonics method 滤波的差异分析
Google Earth Engine(GEE)——使用MODIS数据单点测试SG滤波和harmonics method 滤波的差异分析
262 0
Google Earth Engine(GEE)——影像进行数学运算(NDVI为例)!
Google Earth Engine(GEE)——影像进行数学运算(NDVI为例)!
815 0
Google Earth Engine(GEE)——影像进行数学运算(NDVI为例)!
|
7月前
|
计算机视觉
LabVIEW在 XY Graph中选择一组点
LabVIEW在 XY Graph中选择一组点
39 2
|
机器学习/深度学习 编解码 人工智能
ATC 模型转换动态 shape 问题案例
ATC(Ascend Tensor Compiler)是异构计算架构 CANN 体系下的模型转换工具:它可以将开源框架的网络模型(如 TensorFlow 等)以及 Ascend IR 定义的单算子描述文件转换为昇腾 AI 处理器支持的离线模型;模型转换过程中,ATC 会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾 AI 处理器上。
228 0
|
算法
Google Earth Engine ——MCD43A4 V6天底双向反射分布函数调整反射率(NBAR)这个产品结合了Terra和Aqua航天器的数据,从16天的时间里选择最好的代表像素。
Google Earth Engine ——MCD43A4 V6天底双向反射分布函数调整反射率(NBAR)这个产品结合了Terra和Aqua航天器的数据,从16天的时间里选择最好的代表像素。
776 0
Google Earth Engine ——MCD43A4 V6天底双向反射分布函数调整反射率(NBAR)这个产品结合了Terra和Aqua航天器的数据,从16天的时间里选择最好的代表像素。
|
流计算
Google Earth Engine(GEE)——在线计算列表二维ee.List对象为线性回归方程计算slope和残差
Google Earth Engine(GEE)——在线计算列表二维ee.List对象为线性回归方程计算slope和残差
502 0
Google Earth Engine(GEE)——在线计算列表二维ee.List对象为线性回归方程计算slope和残差
Google Earth Engine ——MYD11A1 V6产品提供1200×1200公里网格内的每日陆地表面温度(LST)和发射率值数据集
Google Earth Engine ——MYD11A1 V6产品提供1200×1200公里网格内的每日陆地表面温度(LST)和发射率值数据集
438 0
Google Earth Engine ——MYD11A1 V6产品提供1200×1200公里网格内的每日陆地表面温度(LST)和发射率值数据集
|
编解码 区块链
Google Earth Engine——WWF/HydroSHEDS/03VFDEM该数据集的分辨率为3弧秒。3角秒的数据集是虚空填充DEM、水文条件DEM和排水(流)方向
Google Earth Engine——WWF/HydroSHEDS/03VFDEM该数据集的分辨率为3弧秒。3角秒的数据集是虚空填充DEM、水文条件DEM和排水(流)方向
153 0
Google Earth Engine——WWF/HydroSHEDS/03VFDEM该数据集的分辨率为3弧秒。3角秒的数据集是虚空填充DEM、水文条件DEM和排水(流)方向
|
编解码 区块链
Google Earth Engine——WWF/HydroSHEDS/30DIR该数据集的分辨率为30弧秒。30角秒的数据集是水文条件下的DEM、排水(流)方向和流量累积。1km分辨率DEM
Google Earth Engine——WWF/HydroSHEDS/30DIR该数据集的分辨率为30弧秒。30角秒的数据集是水文条件下的DEM、排水(流)方向和流量累积。1km分辨率DEM
149 0
Google Earth Engine——WWF/HydroSHEDS/30DIR该数据集的分辨率为30弧秒。30角秒的数据集是水文条件下的DEM、排水(流)方向和流量累积。1km分辨率DEM
|
传感器 编解码 算法
Google Earth Engine ——MODIS叶面积指数Leaf Area Index (LAI) 产品是一个为期4天的综合数据集,500米分辨率数据集
Google Earth Engine ——MODIS叶面积指数Leaf Area Index (LAI) 产品是一个为期4天的综合数据集,500米分辨率数据集
908 0
Google Earth Engine ——MODIS叶面积指数Leaf Area Index (LAI) 产品是一个为期4天的综合数据集,500米分辨率数据集