博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
立体图
阅读量:6938 次
发布时间:2019-06-27

本文共 2791 字,大约阅读时间需要 9 分钟。

【题目描述】

小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
这里写图片描述
每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示。字符’+’,”-”,”/”,”|”的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’来代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
若两块积木上下相邻,图示为:
若两块积木前后相邻,图示为:
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
【输入格式】
输入文件drawing.in第一行有用空格隔开的2个整数n和m,表示有n*m个格子(1<=n,m<=50)。
接下来的n行,是一个n*m的矩阵,每行有m个用空格隔开的整数,其中第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
【样例输出】
……+—+—+…+—+
..+—+ / /|../ /|
./ /|-+—+ |.+—+ |
+—+ |/ /| +-| | +
| | +—+ |/+—+ |/|
| |/ /| +/ /|-+ |
+—+—+ |/+—+ |/| +
| | | +-| | + |/.
| | |/ | |/| +..
+—+—+—+—+ |/…
| | | | | +….
| | | | |/…..
+—+—+—+—+……
//建议复制到记事本里
【分析】
根据常识我们知道,如果有两个积木是叠在一起的,下面的会被上面的遮住,左面的会被右面的遮住,后面的会被前面的遮住。为了方便,可以从下往上,从左往右,从后往前打印积木。
打印的时候我们可以发现,知道了积木的一角就知道了整个积木。此处考虑左下角。所以现在只要求出立体图的长、高和每个积木左下角的位置即可。

先计算长(设为w)吧。考虑第一行(为了不考虑讨厌的遮挡),首先如果是平面图形,那么宽就是4m+1(画个图就知道,七年级数学不解释)。然而这并不是平面图形,是立体的,就要考虑到积木的边会倾斜,然后后面的边和前面的边就是一个平行四边形而不是长方形,然后就要在基准4n+1的基础上增加。观察只有一个立方体的情况可以发现,前方右下角的“+”比后方右下角的“+”向右移动了两格。共有m行,所以宽为2n+4m+1。

然后计算高(设为h)。对于α个积木摞在一起的情况(暂且看作平面图形),高度为3α+1(画个图就知道,七年级数学还是不解释)。然而这也不是平面图形,然后考虑到倾斜和遮挡,可以发现一个积木会倾斜2格,所以共倾斜3α+1+2(n-i+1)格(i表示第i行)。最后的总高度就是这n*m个高度的最大值。

最后计算每个积木左下角的坐标。设当前的积木是第i行, 第j列 , 从下至上第k个,则其横坐标为h-2(n-i)-3(k-1),纵坐标为2(n-i)+4(j-1)+1。

先把画布全部初始化为“.”,然后依次填入积木即可。

uses math;var  c:array[0..1001,0..1001]of char;    g:array[0..101,0..101]of longint;    i,j,k,m,n,h,w:longint;procedure draw(x,y:longint);begin  c[x,y]:='+';c[x,y+1]:='-';c[x,y+2]:='-';c[x,y+3]:='-';c[x,y+4]:='+';  c[x-1,y]:='|';c[x-1,y+1]:=' '; c[x-1,y+2]:=' ';c[x-1,y+3]:=' ';c[x-1,y+4]:='|';c[x-1,y+5]:='/';  c[x-2,y]:='|';c[x-2,y+1]:=' '; c[x-2,y+2]:=' ';c[x-2,y+3]:=' ';c[x-2,y+4]:='|';c[x-2,y+5]:=' ';c[x-2,y+6]:='+';  c[x-3,y]:='+';c[x-3,y+1]:='-';c[x-3,y+2]:='-';c[x-3,y+3]:='-';c[x-3,y+4]:='+';c[x-3,y+5]:=' ';c[x-3,y+6]:='|';    c[x-4,y+1]:='/';c[x-4,y+2]:=' '; c[x-4,y+3]:=' ';c[x-4,y+4]:=' ';c[x-4,y+5]:='/';c[x-4,y+6]:='|';    c[x-5,y+2]:='+';c[x-5,y+3]:='-';c[x-5,y+4]:='-';c[x-5,y+5]:='-';c[x-5,y+6]:='+';end;begin  readln(n,m);    w:=4*m+2*n+1;    h:=0;    for i:=1 to n do      for j:=1 to m do          begin              read(g[i,j]);                h:=max(h,2*(n-i+1)+g[i,j]*3+1);            end;    for i:=1 to h do      for j:=1 to w do          c[i,j]:='.';    for i:=1 to n do      for j:=1 to m do          for k:=1 to g[i,j] do              draw(h-2*(n-i)-3*(k-1),2*(n-i)+4*(j-1)+1);  for i:=1 to h do begin      for j:=1 to w do write(c[i,j]);        writeln;    end;end.

这里写图片描述

转载于:https://www.cnblogs.com/JRX2015U43/p/6533524.html

你可能感兴趣的文章
page_address()函数分析--如何通过page取得虚拟地址
查看>>
关于C#基类和子类函数调用问题
查看>>
性能测试知多少:性能分析与调优的原理
查看>>
js 正则之 控制字符 \cX
查看>>
由 12306.cn 谈谈高并发+高负载网站性能技术
查看>>
u3d 加密资源并缓存加载
查看>>
html5本地存储
查看>>
在css加载完毕后执行后续代码
查看>>
iOS: 学习笔记, 透过Boolean看Swift(译自: https://developer.apple.com/swift/blog/ Aug 5, 2014 Boolean)...
查看>>
db4o种纯对象数据库引擎
查看>>
人可以做自己的领导者。最好的领导者绝不是诸葛亮那样鞠躬尽瘁,而是司马懿那样耐得住寂寞,审时度势...
查看>>
安卓开发笔记——TabHost组件(一)(实现底部菜单导航)
查看>>
使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL
查看>>
TCP的那些事儿(上)
查看>>
公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播...
查看>>
LeetCode - Jump Game
查看>>
UIAlertController Changes in iOS 8
查看>>
Service-stack.redis 使用PooledRedisClientManager 速度慢的原因之一
查看>>
SSL连接建立过程分析(1)
查看>>
行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
查看>>