立体图

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

这里写图片描述

posted @ 2016-09-16 22:17  JRX2015U43  阅读(325)  评论(0编辑  收藏  举报