【题目描述】
小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:![这里写图片描述](http://cdn.luogu.org/upload/pic/21.png)
![](http://cdn.luogu.org/upload/pic/22.png)
![](http://cdn.luogu.org/upload/pic/23.png)
![](http://cdn.luogu.org/upload/pic/24.png)
先计算长(设为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.