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冲刺之立体图的更多相关文章

  1. 2018.10.20 2018NOIP冲刺之酒厂选址

    题目传送门 明显能够看出有一个建图求路程的优化 然而发现10000*10000爆空间QAQ 为了做一些初始化方面的优化 我们发现了一个叫做前缀和的东西 可以在环上查到两个之间的最短距离 同时还要做一些 ...

  2. 2018.11.2 2018NOIP冲刺之最短公共父串

    很有意思的一个题 试题描述 给定字符串A和字符串B,要求找一个最短的字符串,使得字符串A和B均是它的子序列. 输入 输入包含两行,每行一个字符串,分别表示字符串A和字符串B.(串的长度不超过30) 输 ...

  3. 2018.9.8 2018NOIP冲刺之配对

    普及组第四题难度 主体思路竟然是贪心Q_Q 链接:https://www.nowcoder.com/acm/contest/164/D来源:牛客网 题目描述 小A有n个长度都是L的字符串.这些字符串只 ...

  4. 2018.9.26 2018NOIP冲刺之栈

    最小字典序(stack) 输入序列中有 n 个正整数,栈 S 开始为空. 你每次只可以进行下面两种操作之一:① 将输入序列头端的数据移至 S 栈顶(进 S 栈): ②  将 S 栈顶元素输出并删除(退 ...

  5. 怎么把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. ...

  6. 2018.10.26 浪在ACM 集训队第四次测试赛

    2018.10.26 浪在ACM 集训队第四次测试赛 题目一览表 来源 考察知识点 完成时间 A 生活大爆炸版 石头剪刀布  NOIP 提高组 2014   模拟???  2018.11.9 B 联合 ...

  7. python中使用Opencv进行车牌号检测——2018.10.24

    初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...

  8. OSC Source Code Innovation Salon(2018.10.20)

    时间:2018.10.20地点:北京 朝阳 浦项中心B座2层

  9. IDC Digital Transition Annual Festival(2018.10.19)

    时间:2018.10.19地点:北京万达文化酒店

随机推荐

  1. Java异常处理错误

    Java异常处理错误 研究发现,在编译阶段的最佳时机错误,序之前.然而,编译期间并不能找出全部的错误,余下的问题必须在执行阶段解决.这就须要错误源通过某种方式把适当的信息传给某个接收者,该接收者知道怎 ...

  2. Entity framework 更改模型,新增表

    在Package Manager Console 中运行命令Enable-Migrations 再次运行可以更新 抄袭 在实体类中增加一个属性以后,执行 Update-Database 命令 ,可以更 ...

  3. 就服务器项目部署debug谈谈自己的感受

    前言 学校小组Project那些外国人啥也不会, 基本上我一个人全包了前端和后端, 说实话这些天来也感受到了写一个比较拿得出手的web确实也不是这么容易的, 特别是我没什么项目经验, 很多时候碰到问题 ...

  4. discuz电脑访问手机版域名怎么跳转到电脑版本

    用discuz论坛访问手机版本的域名不会自动跳转到电脑版本,而是会跳转到域名+misc.php?mod=mobile体验很不好.现提供修改方法:打开论坛根目录找到文件./source/class/di ...

  5. WPF中获取鼠标相对于屏幕的位置

    原文:WPF中获取鼠标相对于屏幕的位置 WPF中获取鼠标相对于屏幕的位置                                   周银辉WPF编程时,我们经常使用Mouse.GetPosi ...

  6. Go 的文件系统抽象 Afero

    Afero 是一个文件系统框架,提供一个简单.统一和通用的 API 和任何文件系统进行交互,作为抽象层还提供了界面.类型和方法.Afero 的界面十分简洁,设计简单,舍弃了不必要的构造函数和初始化方法 ...

  7. 八荣八耻 IT版

    八荣八耻 IT版以可配置为荣,以硬编码为耻:以系统互备为荣,以系统单点为耻:以随时可重启为荣,以不能迁移为耻:以整体交付为荣,以部分交付为耻:以无状态为荣,以有状态为耻:以标准化为荣,以特殊化为耻:以 ...

  8. 微信小程序把玩(七)数据绑定

    原文:微信小程序把玩(七)数据绑定 数据绑定有一部分前几个看着还行,后面的几个可能有几个不理解,界面展示的数据有的也因为条件没法显示.看不懂的可以先记着,后面真正用到时就会明白,反正我是这样想的.这里 ...

  9. win32内存调用图

    https://msdn.microsoft.com/en-us/library/ms810603.aspxhttps://www.codeproject.com/Articles/14525/Hea ...

  10. 80%的岗位是没有太多能力上的要求的(少部分聪明的人开始觉醒,这部分一定是那些主动追求、主动学习的人;30岁现象能区分真正专业和不学无术的人)good

    不要沦陷程序员的30岁问题     热门> 就是学习能力和工作热情态度的问题. 我之前也跟作者一样思考过这个问题,答案是否定的. 在知识积累的行业,年纪越大,越吃香,比如金融,医学,IT.就怕3 ...