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+2hy=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掉,自认为挺水的。

 
时间: 2024-10-09 05:46:44

NOIP2008 立体图的相关文章

NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放: 每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示.字符’+’,”-”,”/”,”|”的ASCII

noip2008普及组4题题解-rLq

(啊啊啊终于补到了今天的作业了) 本题地址:http://www.luogu.org/problem/show?pid=1058 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图.小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:每个顶

NOIP2008普及组 题解 -SilverN

T1 ISBN号码 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标 准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第 二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码. 识别码的计

NOIP2008pj &amp; luoguP1058 立体图 模拟

P1058 立体图 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放: 每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示.字符’+’,”-”,”/”

luoguP1058:立体图 (真的不是娱乐向_(:з」∠)_)

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放: 每个顶点用1个加号'+'表示,长用3个"-"表示,宽用1个"/",高用两个"|"表

Noip2008提高组初赛 C

第十四届(NOIP2008)信息学奥赛联赛提高组C语言初赛试题 ● ●  全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效  ●● 一. 单项选择题 (共10题,每题1.5分,共计15分.每题有且仅有一个正确答案). 1. 在以下各项中,(C  )不是操作系统软件. A. Solaris   B. Linux    C. Sybase     D. Windows Vista      E. Symbian A:索拉瑞斯是Sun Microsystems研发的计算机操作系统.它被认为是UNI

三维立体图的原理和欣赏方法

上高中的时候第一次接触三维立体图,有位同学拿着一幅花花绿绿杂乱无章的图片盯着看,然后就说他看见了什么立体,描述的煞有介事,我当时看了一个下午,把眼睛看花了也看不出来是什么东西,没想到上了大学学习摄影测量,这立体成了我的专业,了解了立体成像的原理,现在我看这种立体就跟看普通图片似的,凝视几秒钟就看清楚了,真是知识的力量!本来想着自己写一篇这方面的帖子,结果网上一搜,已经有很人把这个问题讲的很好了,但是有些地方还不是很清楚,特将原文主要部分转来此处并做一解释! 以下是正文(红色为本人评论):原文网址

NOIP2008 双栈排序 染色+模拟

挺不错的一道题,首先可以知道若存在形如 k<i<j 但 a[k]<a[i]<a[j]这样的,那么i,j一定不能(从始至终不能)进入同一个栈 例如 2 3 1,若2 3进入同一个栈,那么1再进栈然后马上出栈,这时候,2没有办法在3之前出来. 所以对于这样的i,j我们连一条边,然后dfs染色,若染色中发现相邻点颜色相同,则无解,否则我们按照1,2,1,2的顺序染色. 确定了每一个数属于哪个栈后,用2个stack模拟一下就好了. #include <iostream> #in

洛谷 P1125 笨小猴(NOIp2008提高组T1)

题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入输出格式 输入格式: 输入文件word.in只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100. 输出格