立体图

mac2022-06-30  29

【题目描述】 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。 小渊有一块面积为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

最新回复(0)