noip2008第四题立体图(pascal语言)

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

每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’ ‘-‘’/’ ‘|’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
..+---+---+
./ / /|
+---+---+ |
| | | +
| | |/.
+---+---+..
若两块积木上下相邻,图示为:
..+---+
./ /|
+---+ |
| | +
| |/|
+---+ |
| | +
| |/.
+---+..
若两块积木前后相邻,图示为:
….+---+
…/ /|
..+---+ |
./ /| +
+---+ |/.
| | +..
| |/…
+---+….
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
【输入】
输入文件drawing.in第一行有用空格隔开的两个整数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列才能按规定输出立体图。

【输入输出样例】
drawing.in drawing.out
3 4
2 2 1 2
2 2 1 1
3 2 1 2 ......+---+---+...+---+
..+---+ / /|../ /|
./ /|-+---+ |.+---+ |
+---+ |/ /| +-| | +
| | +---+ |/+---+ |/|
| |/ /| +/ /|-+ |
+---+---+ |/+---+ |/| +
| | | +-| | + |/.
| | |/ | |/| +..
+---+---+---+---+ |/...
| | | | | +....
| | | | |/.....
+---+---+---+---+......

要用递推实现
一定一定;
还有要讲解详细一点,
思路要清晰;
好就一定有加分
展开
 我来答
shihaoze454
2009-12-01 · TA获得超过612个赞
知道小有建树答主
回答量:164
采纳率:0%
帮助的人:208万
展开全部
Pku原题,编号2330
算不上难题,但是比较麻烦,细心点就ok了。
先计算好画布的大小,再写一个根据左下角坐标绘制一个单位立方体的子程序。
然后遵循下面法则,不停绘制若干个立方体。(此处能体现出分割程序的伟大)
因为要不停的覆盖,所以要遵循“视觉法则”:
1.先绘里层再绘外层
2.先绘底层再绘上层
3.先回左边再绘右边
参考程序:
program drawing;
const
inp='drawing.in';
oup='drawing.out';
var
m,n,i,j,k,x,y,h,tmp,maxx,maxy:longint;
map:array[1..1000,1..1000] of char;//画布
a:array[1..50,1..50] of integer;//记录输入的矩阵
procedure flink;
begin
assign(input,inp);
reset(input);
assign(output,oup);
rewrite(output);
end;
procedure fclose;
begin
close(input);
close(output);
end;
procedure print;//输出画布
var
i,j:longint;
begin
for i:= 1 to maxx do
begin
for j:= 1 to maxy do
write(map[i,j]);
if i<>maxx then writeln;
end;
end;
procedure draw(x,y:longint);//在画布(map数组)上绘制左下角坐标为(x,y)的一个单位立方体
begin
map[x,y]:='+';map[x,y+1]:='-'; map[x,y+2]:='-';map[x,y+3]:='-';map[x,y+4]:='+';
dec(x);
map[x,y]:='|';map[x,y+1]:=' '; map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='|';
map[x,y+5]:='/';
dec(x);
map[x,y]:='|';map[x,y+1]:=' '; map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='|';
map[x,y+5]:=' ';map[x,y+6]:='+';
dec(x);
map[x,y]:='+';map[x,y+1]:='-'; map[x,y+2]:='-';map[x,y+3]:='-';map[x,y+4]:='+';
map[x,y+5]:=' ';map[x,y+6]:='|';
dec(x); inc(y);
map[x,y]:='/';map[x,y+1]:=' '; map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='/';
map[x,y+5]:='|';
dec(x);inc(y);
map[x,y]:='+';map[x,y+1]:='-'; map[x,y+2]:='-';map[x,y+3]:='-';map[x,y+4]:='+';
end;
begin
flink;
for i:= 1 to 1000 do
for j:= 1 to 1000 do
map[i,j]:='.'; //初始化画布
readln(m,n);
//计算画布大小maxx * maxy
maxy:=n*4+1+m*2;
maxx:=0;
for i:= 1 to m do
begin
tmp:=0;
for j:= 1 to n do
begin
read(a[i,j]);
if a[i,j]>tmp then tmp:=a[i,j];
end;
tmp:=tmp*3+3+(m-i)*2;
if tmp >maxx then maxx:=tmp;
readln;
end;
//开始往画布上绘图
for i:= 1 to m do
for j:= 1 to n do
begin
x:=maxx-(m-i)*2;//第i层第j列最下方立方体左下角点的位置(x,y)
y:=(m-i)*2+(j-1)*4+1;
for k:= 1 to a[i,j] do
draw(x-(k-1)*3,y);//绘制每层的若干个一个单位立方体
end;
print;//输出画布
fclose;
end.
zyh617517224
2009-12-02 · TA获得超过1549个赞
知道小有建树答主
回答量:654
采纳率:0%
帮助的人:809万
展开全部
******************************************************************
版权所有 严禁抄袭
******************************************************************
var a:array[0..1000,0..1000]of char;
b,c:array[1..50,1..50]of longint;
i,j,n,m,maxm,maxn,q,ny,nx,k:longint;
procedure asd(x,y:longint);
begin
a[x,y+2]:='+';
a[x,y+3]:='-';
a[x,y+4]:='-';
a[x,y+5]:='-';
a[x,y+6]:='+';
a[x+1,y+1]:='/';
a[x+1,y+2]:=' ';
a[x+1,y+3]:=' ';
a[x+1,y+4]:=' ';
a[x+1,y+5]:='/';
a[x+1,y+6]:='|';
a[x+2,y]:='+';
a[x+2,y+1]:='-';
a[x+2,y+2]:='-';
a[x+2,y+3]:='-';
a[x+2,y+4]:='+';
a[x+2,y+5]:=' ';
a[x+2,y+6]:='|';
a[x+3,y]:='|';
a[x+3,y+1]:=' ';
a[x+3,y+2]:=' ';
a[x+3,y+3]:=' ';
a[x+3,y+4]:='|';
a[x+3,y+5]:=' ';
a[x+3,y+6]:='+';
a[x+4,y]:='|';
a[x+4,y+1]:=' ';
a[x+4,y+2]:=' ';
a[x+4,y+3]:=' ';
a[x+4,y+4]:='|';
a[x+4,y+5]:='/';
a[x+5,y]:='+';
a[x+5,y+1]:='-';
a[x+5,y+2]:='-';
a[x+5,y+3]:='-';
a[x+5,y+4]:='+';
end;
begin
readln(m,n);
fillchar(a,sizeof(a),'.');
for i:=1 to m do
for j:=1 to n do begin
read(b[i,j]);
q:=b[i,j]*3+3;
c[i,j]:=q+2*(m-i);
if c[i,j]>maxn then maxn:=c[i,j];
end;
maxm:=2*m+4*n+1;
for i:=1 to m do begin
ny:=-3+2*(m-i);
for j:=1 to n do begin
ny:=ny+4;
nx:=maxn-2*(m-i)-5;
for k:=1 to b[i,j] do begin
asd(nx,ny);
nx:=nx-3;
end;
end;
end;
for i:=1 to maxn do begin
for j:=1 to maxm do write(a[i,j]);
writeln;
end;
end.
首先递推求出输出的图形的长宽以及杂碎的东西,再模拟.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dengkehao
2009-12-01 · TA获得超过913个赞
知道小有建树答主
回答量:302
采纳率:0%
帮助的人:266万
展开全部
var m,n,i,j,k,x,y,t,maxx,maxy:longint;
map:packed array[1..600,1..600] of char;
a:packed array[1..100,1..100] of longint;
procedure print;
var i,j:longint;
begin
for i:= 1 to maxx do begin
for j:= 1 to maxy do write(map[i,j]);if i<>maxx then writeln;end;
end;
procedure draw(x,y:longint);
begin
map[x,y]:='+';map[x,y+1]:='-';map[x,y+2]:='-';map[x,y+3]:='-';
map[x,y+4]:='+';dec(x);map[x,y]:='|';map[x,y+1]:=' ';
map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='|';map[x,y+5]:='/';
dec(x);map[x,y]:='|';map[x,y+1]:=' ';map[x,y+2]:=' ';
map[x,y+3]:=' ';map[x,y+4]:='|';map[x,y+5]:=' ';map[x,y+6]:='+';
dec(x);map[x,y]:='+';map[x,y+1]:='-';map[x,y+2]:='-';
map[x,y+3]:='-';map[x,y+4]:='+';map[x,y+5]:=' ';map[x,y+6]:='|';
dec(x);inc(y);map[x,y]:='/';map[x,y+1]:=' ';map[x,y+2]:=' ';
map[x,y+3]:=' ';map[x,y+4]:='/';map[x,y+5]:='|';dec(x);inc(y);
map[x,y]:='+';map[x,y+1]:='-';map[x,y+2]:='-';map[x,y+3]:='-';
map[x,y+4]:='+';
end;
begin
for i:=1 to 300 do
for j:=1 to 300 do map[i,j]:='.';
readln(m,n);maxy:=n*4+1+m*2;maxx:=0;
for i:= 1 to m do begin tmp:=0;
for j:=1 to n do begin read(a[i,j]);if a[i,j]>t then t:=a[i,j];end;
t:=t*3+3+(m-i)*2;if t>maxx then maxx:=t;readln;end;
for i:=1 to m do
for j:=1 to n do begin x:=maxx-(m-i)*2;y:=(m-i)*2+(j-1)*4+1;
for k:= 1 to a[i,j] do draw(x-(k-1)*3,y);end;
print;
end.
此题不难,但很麻烦。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式