• NOIP2008 立体图


    题目描述

    小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。

    小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

    每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示。字符’+’,”-”,”/”,”|”的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’来代替。立体图的画法如下面的规则:

    若两块积木左右相邻,图示为:

    若两块积木上下相邻,图示为:

    若两块积木前后相邻,图示为:

    立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。

    输入输出格式

    输入格式:

     

    输入文件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列才能按规定输出立体图。

     

    输入输出样例

    输入样例#1:
    3 4
    2 2 1 2
    2 2 1 1
    3 2 1 2
    
    输出样例#1:
    ......+---+---+...+---+
    ..+---+  /   /|../   /|
    ./   /|-+---+ |.+---+ |
    +---+ |/   /| +-|   | +
    |   | +---+ |/+---+ |/|
    |   |/   /| +/   /|-+ |
    +---+---+ |/+---+ |/| +
    |   |   | +-|   | + |/.
    |   |   |/  |   |/| +..
    +---+---+---+---+ |/...
    |   |   |   |   | +....
    |   |   |   |   |/.....
    +---+---+---+---+......

    拿到题目以后就感觉如果要编好这道题需要一定的耐心(嗯这么多立方体会被搞得有点烦)。。。

    思路

    建立一个画布,我们在画布上面打印立方体,我们可以用覆盖打印的方法来解决前后立方体在画布上的前后问题。
    要覆盖打印,我们需要从左到右,从后到前,从下到上打印。
    建立一个print(x,y)过程来打印坐标为x,y的立方体,(x,y)这个点为这个立方体的左下角.

    然后就有了几件非常有趣的事情,要打印这些立方体,给出它的行号,列好以及它在第几层,求它的左下角的点的坐标。
    我们设h为此立方体在从前到后第h行,c为此立方体从下往上第c层,l为此立方体从左到右第l个。
    则得到print(x,y)的坐标

    x=1+3l+2h
    y=1+2h+3c

    然后使用print(x,y)来打印就好啦!

    代码
     1 var
     2         p:array[1..50,1..50] of longint;
     3         map:array[0..5000,0..5000] of char;  
     4         qh,qk,mb:longint;
     5         n,m:longint;
     6         i,j,k,xx,yy:Longint;
     7 procedure print(x,y:longint);  //print在画布上打印立方体
     8 begin
     9         map[x,y]:='+';map[x,y+1]:='-';map[x,y+2]:='-';map[x,y+3]:='-';map[x,y+4]:='+';
    10         map[x-1,y]:='|';map[x-1,y+1]:=' ';map[x-1,y+2]:=' ';map[x-1,y+3]:=' ';map[x-1,y+4]:='|';map[x-1,y+5]:='/';
    11         map[x-2,y]:='|';map[x-2,y+1]:=' ';map[x-2,y+2]:=' ';map[x-2,y+3]:=' ';map[x-2,y+4]:='|';map[x-2,y+5]:=' ';map[x-2,y+6]:='+';
    12         map[x-3,y]:='+';map[x-3,y+1]:='-';map[x-3,y+2]:='-';map[x-3,y+3]:='-';map[x-3,y+4]:='+';map[x-3,y+5]:=' ';map[x-3,y+6]:='|';
    13         map[x-4,y+1]:='/';map[x-4,y+2]:=' ';map[x-4,y+3]:=' ';map[x-4,y+4]:=' ';map[x-4,y+5]:='/';map[x-4,y+6]:='|';
    14         map[x-5,y+2]:='+';map[x-5,y+3]:='-';map[x-5,y+4]:='-';map[x-5,y+5]:='-';map[x-5,y+6]:='+';
    15 end;
    16 begin
    17         readln(m,n);
    18         qh:=0;
    19         qk:=0;
    20         mb:=0;
    21         fillchar(map,sizeof(map),'.');
    22         for i:=m downto 1 do
    23                 for j:=1 to n do
    24                 begin
    25                         read(p[i,j]);
    26                         if (1+i*2+p[i,j]*3>qh) then
    27                                 qh:=1+i*2+p[i,j]*3;
    28                         if (1+j*4+2*i>qk) then
    29                                 qk:=1+j*4+2*i;
    30                         if p[i,j]>mb then mb:=p[i,j];
    31                         //此处是一堆无用的代码
    32                 end;
    33         for k:=1 to mb do  //从底层往顶层
    34         begin
    35                 for i:=m downto 1 do   //从后排到前排
    36                 begin
    37                         for j:=1 to n do   //从左边到右边
    38                         begin
    39                                 if p[i,j]<=0 then continue;  //按照输入打印
    40                                 dec(p[i,j]);        //减掉已经打印的
    41                                 xx:=qh-(1+(i-1)*2+(k-1)*3);  //计算print的x
    42                                 yy:=1+4*(j-1)+2*(i-1);           //计算print的y
    43                                 print(xx,yy)   //打印
    44                         end;
    45                 end;
    46         end;
    47         for i:=0 to qh-1 do
    48         begin
    49                 for j:=1 to qk do
    50                         write(map[i,j]);   //输出
    51                 writeln;
    52         end;
    53 end.    
    
    

    画布要开够大但是不要太大爆掉,我就第一次交的时候没有注意画布数组的大小直接爆掉(自己骂自己傻逼),改了以后A掉,自认为挺水的。

     
  • 相关阅读:
    django第二个项目使用模板做一个站点访问计数器
    python 从ftp下载数据
    django第一个项目HelloWord
    数据挖掘之KNN分类
    java的函数参数传递
    将数组按照奇偶顺序排列
    win7 64位下安装nltk的问题
    [转]安装androidADT插件长时间停留在calculating requirements and dependencies
    排序算法之插入排序
    非等值折半查找
  • 原文地址:https://www.cnblogs.com/SJum/p/6613208.html
Copyright © 2020-2023  润新知