Clumsy Keke【模拟+三维数组】
Clumsy Keke
Problem Description
Keke is currently studying engineering drawing courses, and the teacher has taught her how to find its volume through the three views of the part. But her brain doesn't work well that she can't find the volume of complex parts. So she needs your help.
To simplify the problem, the part is made up of cubes with side length 1, and the vertices of these cubes are all on the grid. Give you three 0/1 matrices, each representing each of the three views. 0 means that there is no projection of cubes at this position of the view; 1 means that there is a projection of cubes at this position of the view.
Now Keke wants you to help her find the volume of the part determined by the three views.
Input
There are mutiple test cases, the number of which is no more than 10. For each test case:
The first line of input contains three integers mx,my,mz(1≤mx,my,mz≤99) , which represent the coordinate range of all possible cubes (i.e. all possible cubes are in the cuboid area whose body diagonal is from (1,1,1) to (mx,my,mz)).
Following input a 0/1 matrix with mx lines and my columns representing the front view, and the y-th column of the x-th row represents the projection of all the cubes in the front view such as (x,y,?).
Following input a 0/1 matrix with my lines and mz columns representing the side view, and the z-th column of the y-th row represents the projections of all the cubes in the side view such as (?,y,z).
Following input a 0/1 matrix with mz lines and mx columns representing the top view, and the x-th column of the z-th row represents the projection of all the cubes of the top view such as (x,?,z).
The '?' in the above coordinates represents any integer. Numbers in the same line are separated by spaces. For more detailed input information, please see the sample.
Output
For each test case:
The first line of output should contain an integer, representing the volume of the part determined by the three views. If the determined part is not unique, find the largest of all possible parts.
Keke's teacher promises that there is at least one part that satisfies the input.
Sample Input
5 6 4
1 1 1 1 1 1
0 0 0 1 0 1
0 0 0 1 0 1
0 0 0 0 0 1
0 0 0 0 0 1
0 1 1 0
1 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1
1 1 1 1
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
1 1 1 1 1Sample Output
17
Hint
思路:
找了好长时间的规律最终失败 后来想起来可以先把符合正视图的坐标保存起来 然后通过后面两个视图筛 听学长说这就是模拟
开三维数组 模拟空间的x、y、z的坐标 感觉很神奇 ……
但自己敲的时候 因为没好好找坐标原点导致自己超级混乱 又看到给出的点和下面的视图并不是相同方向的 就不知所措了
仔细想了想其实这样给点是超级巧妙的:
建立如图坐标系:
在第一组数据中 描述x和y的关系 输入的点中左上角代表原点(真的是空间坐标原点) 向右为y 向下为x 均从零依次增大 再去标记点岂不是很容易
同理 第二次输入z和y的关系 左上角依然是原点
所以建立坐标系一定要找准原点 不然就像刚开始那样乱找关系 容易错误
AC代码:
#include<stdio.h>
#include<string.h>
const int MAX=1e2;
int main()
{
    int a[MAX+5][MAX+5][MAX+5],x,y,z;
    while(~scanf("%d%d%d",&x,&y,&z)){
        memset(a,0,sizeof(a));
        int sum=0;              ///标记的总个数-后来删去的个数=最终结果 开始是最后重新跑了
        for(int i=0;i<x;i++){        ///次循环判断个数 但T了 只好这样改了
            for(int j=0;j<y;j++){
                int num;
                scanf("%d",&num);
                if(num==1){
                    for(int k=0;k<z;k++){
                        a[i][j][k]=1;
                        sum++; ///符合主视图 条件的所有点的个数
                    }
                }
            }
        }
        for(int i=0;i<y;i++){
            for(int j=0;j<z;j++){
                int num;
                scanf("%d",&num);
                if(num==0){
                    for(int k=0;k<x;k++){
                        if(a[k][i][j]==1){
                            a[k][i][j]=-1;
                            sum--; ///从原来标记的点中删去不符合侧视图的点
                        }
                    }
                }
            }
        }
        for(int i=0;i<z;i++){
            for(int j=0;j<x;j++){
                int num;
                scanf("%d",&num);
                if(num==0){
                    for(int k=0;k<y;k++){
                        if(a[j][k][i]==1){
                            a[j][k][i]=-1;
                            sum--;     ///从原来标记的点中删去不符合俯视图的点
                        }
                    }
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
Clumsy Keke【模拟+三维数组】的更多相关文章
- jquery   根据后台传递过来的三维数组动态生成三级菜单
		根据后台传递过来的三维数组动态生成三级菜单 <!DOCTYPE html> <html lang="en"> <head> <meta c ... 
- Jni :三维数组处理方法 ,以整形三维数组为例 C++实现
		本文原创,转载请注明地址:http://www.cnblogs.com/baokang/p/4982846.html 关于Jni的基本使用方法,请参阅:Java 调用 C++ (Java 调用 dll ... 
- C语言三维数组分解
		很多人在学习C的时候,感觉三维数组很难想象,而且不理解深度是什么?做了一个图,帮大家分解一下 ... 
- Java 一维数组 二维数组 三维数组
		二维数组包含一位数组 三维数组就是在二维数组的基础上,再加一层.把二维数组看做是一维数组就可以了,按照上述理解类推. 下面是 一维 二维 三维数组例子 一维数组: int[] array1 ... 
- 三维数组——与 宝玉QQ群讨论交流之二
		宝玉 12:27:35 这几天看了大部分大家交的作业,发现一个主要问题还是卡在对三维数组的理解上,之前把三维数组类比成三维空间可能会造成误导 宝玉 12:27:45 其实鞠老师解释的很好: 三维数组 ... 
- c# 基础之数组(包含三维数组)
		public enum ChessType { White = , None=, Black=, } class Program { static void Main(string[] args) { ... 
- php三维数组变二维数组
		<?php $result = Array(0 => Array(0 => Array(bid => 41,brealname => 'we教官',cid => 4 ... 
- C++类实现三维数组算法
		在学习北京大学教授的<程序设计实习 / Practice on Programming>中,遇到了一个习题,花了很长时间研究,现在分享出来: 课题地址:https://class.cour ... 
- java读取目录下所有csv文件数据,存入三维数组并返回
		package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ... 
随机推荐
- select 后台获取text 并根据text 设置value选中项
			-------获取select 的text string orderNo = this.orderNo.Items[this.orderNo.SelectedIndex].Text; -----根据t ... 
- Python 字符串内置函数(四)
			# 4.类型判断# isalnum()函数检测字符串是否只由字母和数字组成.s = "this2009"; # 字符中没有空格print(s.isalnum()) # 结果:Tru ... 
- 苏浪浪 201771010120 《面向对象程序设计(java)》第七章学习总结
			第七周 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: (2)掌握Object类的常用API用法: (3)掌握ArrayList类用法与常用API: (4)掌握枚举类使用方法: ( ... 
- springboot使用Jwt处理跨域认证问题
			在前后端开发时为什么需要用户认证呢?原因是由于HTTP协定是不存储状态的,这意味着当我们透过账号密码验证一个使用者时,当下一个request请求时他就把刚刚的资料忘记了.于是我们的程序就不知道谁是谁了 ... 
- pycharm安装Numba失败问题
			相关环境变量: pycharm Python 3.8 pip 19.3.1 Numba各个版本都不行 报错内容: Looking in indexes: https://pypi.tuna.tsing ... 
- docker的镜像加速
			docker加速配置 1,阿里云镜像加速 1.登录:https://dev.aliyun.com/search.html 2.登录阿里云 搜索 容器镜像服务 找到后如下图 ‘ 您可以通过修改da ... 
- 组件-vue自定义方法传递
			组件样式 面包屑导航栏 js Vue.component('bannerOne', { created() { console.log(this.bigbackColor); }, props: { ... 
- 最全的ASCII码对照表
			转自https://blog.csdn.net/jinduozhao/article/details/75398793 十进制代码 十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控 ... 
- C#判断TCP连接状态
- 第4章 最基础的分类算法-k近邻算法
			思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ... 
 
			
		