2018.10.1 2018NOIP冲刺之立体图
2008NOIP普及组立体图 请自行百度(事实上放不下了)
图不是很清楚 下面有
【输入】
输入文件 drawing.in 第一行有用空格隔开的 2 个整数 m 和 n,表示有 m*n 个格子
(1<=m,n<=50)。
接下来的 m 行,是一个 m*n 的矩阵,每行有 n 个用空格隔开的整数,其中第 i 行第 j 列上的整数表示第 i 行第 j 列的个子上摞有多少个积木(1<=每个格子上的积木数<=100)。【输出】
输出文件 drawing.out 中包含题目要求的立体图,是一个 K 行 L 列的字符串矩阵,其中 K 和 L 表示最少需要 K 行 L 列才能按规定输出立体图。
也就是说大概要输出这样一个图
这个图的输入是这样的:
3 4
2 2 1 2
2 2 1 1
3 2 1 2
很明显是一个大模拟的题但是依然有许多坑
第一个解决遮挡问题
为了模拟真正的遮挡我们在画图的时候就选择从后往前画并用立方体中间的空格进行覆盖
- void drawb(int p,int q)
- {
- map[p][q]=map[p-][q]=map[p-][q+]=map[p-][q+]=map[p-][q+]=map[p][q+]=map[p-][q+]='+';
- map[p][q+]=map[p][q+]=map[p][q+]='-';
- map[p-][q+]=map[p-][q+]=map[p-][q+]='-';
- map[p-][q+]=map[p-][q+]=map[p-][q+]='-';
- map[p-][q+]=map[p-][q+]=map[p-][q+]='/';
- //
- for(int i=p-;i<p;i++)
- for(int j=q+;j<=q+;j++)
- map[i][j]=' ';//覆盖部分
- map[p-][q+]=map[p-][q+]=map[p-][q+]=' ';
- map[p-][q+]=map[p-][q+]=' ';
- map[p-][q]=map[p-][q]='|';
- map[p-][q+]=map[p-][q+]='|';
- map[p-][q+]=map[p-][q+]='|';
- return;
- }
第二如何讨论最少的行和列
通过对图的观察我们不难发现:
(1)正面的底边对应一部分行
(2)侧面的底边对应另一部分行(因为侧面恰好可以对应底边)
(即maxx=4*n+1+2*m)
(3)我们对从前往后每一个截面进行讨论:
1、找到这一个截面的最高点
2、通过这个点的高度(从下往上第几层)以及位于第几个斜面(侧面必须作为讨论列的依据)找出最大值
- for(int i=;i<=m;i++)maxx=max(maxh[i]*++*(m-i+),maxx);
到此为止这个题就做完了
上代码
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- int m,n,maxh[],martix[][],maxx,maxy,x[][][],y[][][];
- char map[][];
- void drawb(int p,int q)//画一个立方体,以p,q作为左下角坐标
- {
- map[p][q]=map[p-][q]=map[p-][q+]=map[p-][q+]=map[p-][q+]=map[p][q+]=map[p-][q+]='+';
- map[p][q+]=map[p][q+]=map[p][q+]='-';
- map[p-][q+]=map[p-][q+]=map[p-][q+]='-';
- map[p-][q+]=map[p-][q+]=map[p-][q+]='-';
- map[p-][q+]=map[p-][q+]=map[p-][q+]='/';
- for(int i=p-;i<p;i++)
- for(int j=q+;j<=q+;j++)
- map[i][j]=' ';//覆盖部分
- map[p-][q+]=map[p-][q+]=map[p-][q+]=' ';
- map[p-][q+]=map[p-][q+]=' ';
- map[p-][q]=map[p-][q]='|';
- map[p-][q+]=map[p-][q+]='|';
- map[p-][q+]=map[p-][q+]='|';
- return;
- }
- void init()
- {
- maxy=*n+*m+;
- for(int i=;i<=m;i++)maxx=max(maxh[i]*++*(m-i+),maxx);
- for(int i=;i<=maxx;i++)
- {
- for(int j=;j<=maxy;j++)
- {
- map[i][j]='.';
- }
- }
- x[m][][]=maxx,y[m][][]=;
- for(int i=;i<=n;i++)x[m][i][]=x[m][i-][],y[m][i][]=y[m][i-][]+;
- for(int i=;i<=n;i++)
- {
- for(int j=m-;j>=;j--)
- {
- x[j][i][]=x[j+][i][]-;
- y[j][i][]=y[j+][i][]+;
- }
- }
- for(int i=;i<=m;i++)
- {
- for(int j=;j<=n;j++)
- {
- for(int k=;k<=martix[i][j];k++)
- {
- x[i][j][k]=x[i][j][k-]-;
- y[i][j][k]=y[i][j][k-];
- }
- }
- }
- return;
- }
- void print()
- {
- for(int i=;i<maxx;i++)
- {
- for(int j=;j<=maxy;j++)putchar(map[i][j]);
- putchar('\n');
- }
- for(int j=;j<=maxy;j++)putchar(map[maxx][j]);
- return;
- }
- int main()
- {
- freopen("drawing.in","r",stdin);
- freopen("drawing.out","w",stdout);
- scanf("%d%d",&m,&n);
- for(int i=;i<=m;i++)
- {
- for(int j=;j<=n;j++)
- {
- scanf("%d",&martix[i][j]);
- maxh[i]=max(maxh[i],martix[i][j]);
- }
- }
- init();
- for(int i=;i<=m;i++)
- {
- for(int j=;j<=n;j++)
- {
- for(int k=;k<=martix[i][j];k++)
- {
- drawb(x[i][j][k],y[i][j][k]);
- }
- }
- }
- print();
- fclose(stdin);
- fclose(stdout);
- return ;
- }
---恢复内容结束---
2018.10.1 2018NOIP冲刺之立体图的更多相关文章
- 2018.10.20 2018NOIP冲刺之酒厂选址
题目传送门 明显能够看出有一个建图求路程的优化 然而发现10000*10000爆空间QAQ 为了做一些初始化方面的优化 我们发现了一个叫做前缀和的东西 可以在环上查到两个之间的最短距离 同时还要做一些 ...
- 2018.11.2 2018NOIP冲刺之最短公共父串
很有意思的一个题 试题描述 给定字符串A和字符串B,要求找一个最短的字符串,使得字符串A和B均是它的子序列. 输入 输入包含两行,每行一个字符串,分别表示字符串A和字符串B.(串的长度不超过30) 输 ...
- 2018.9.8 2018NOIP冲刺之配对
普及组第四题难度 主体思路竟然是贪心Q_Q 链接:https://www.nowcoder.com/acm/contest/164/D来源:牛客网 题目描述 小A有n个长度都是L的字符串.这些字符串只 ...
- 2018.9.26 2018NOIP冲刺之栈
最小字典序(stack) 输入序列中有 n 个正整数,栈 S 开始为空. 你每次只可以进行下面两种操作之一:① 将输入序列头端的数据移至 S 栈顶(进 S 栈): ② 将 S 栈顶元素输出并删除(退 ...
- 怎么把Thu Nov 22 2018 10:49:36 GMT+0800转换成正常日期
this.data //Thu Nov 22 2018 10:49:36 GMT+0800 this.date_of_birth = date.getFullYear() + '-' + (date. ...
- 2018.10.26 浪在ACM 集训队第四次测试赛
2018.10.26 浪在ACM 集训队第四次测试赛 题目一览表 来源 考察知识点 完成时间 A 生活大爆炸版 石头剪刀布 NOIP 提高组 2014 模拟??? 2018.11.9 B 联合 ...
- python中使用Opencv进行车牌号检测——2018.10.24
初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...
- OSC Source Code Innovation Salon(2018.10.20)
时间:2018.10.20地点:北京 朝阳 浦项中心B座2层
- IDC Digital Transition Annual Festival(2018.10.19)
时间:2018.10.19地点:北京万达文化酒店
随机推荐
- Http请求格式(在Linux下使用telnet亲测,通过这篇我才明白)
命令行窗口中用telnet测试HTTP协议请求消息格式响应消息格式1. 命令行窗口中用telnet测试HTTP协议 HTTP消息是由普通ASCII文本组成.消息包括消息头和数据体部分.消息头以行为单位 ...
- Base64实现测试,不要太相信apache-common的性能
针对三种Base64实现: * 自已实现的 * JDK8的java.util.Base64 * apache-common的org.apache.commons.codec.binary.Base64 ...
- SwiftCafe 咖啡时光 - 了解 Swift 中的闭包
闭包(Closure) 是现代开发语言的必备特性,极大的提高了我们的开发效率. 关于闭包,你可以把它理解为一种特殊的变量或对象.简而言之,我们通常的对象,里面存储的是变量或对象的值,而闭包里面存储的是 ...
- 使用StringBuilder与SqlParameter
好处: 防止sql注入:占用内存更少 例子: 传参有业务查询条件startDate,endDate,A,每页数据个数pageSize,当前查询页码pageIndex string sql = @&qu ...
- WPF三维图形
原文:WPF三维图形 wpf 三维图形基础生成三维图形的基本思想是能得到一个物体的三维立体模型(model).由于我们的屏幕只有二维,因而我们定义了一个用于给物体拍照的照相机(Camera).拍到的照 ...
- Vue-cli入门(一)——项目搭建
Vue-cli入门(一)——项目搭建 前言: Vue-cli是一款基于vue的项目脚手架工具,其集成了webpack环境和主要的依赖,对于我们的项目搭建.开发.打包.维护管理等都是非常的方便. 主要内 ...
- ADO.NET基础开发
ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写.ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供了一个面向对象的数据访问架构, ...
- 零元学Expression Blend 4 - Chapter 40 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(上)
原文:零元学Expression Blend 4 - Chapter 40 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(上) 一直以来都有人拿Flash的动画问我Blend ...
- 比快更快——微软LightGBM
LightGBM介绍 xgboost是一种优秀的boosting框架,但是在使用过程中,其训练耗时过长,内存占用比较大.微软在2016年推出了另外一种boosting框架--lightgbm,在不降低 ...
- Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统 - pacman)
Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统 - pacman)Arch 同时也拥有一个类似 ports 的包构建系统(Arch Build ...