noip2008第四题立体图(pascal语言)
<p>noip2008第四题立体图(pascal语言)</p><p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:0 -</p>
<p>解决时间:2009-12-10 12:35</p>
<p>【问题描述】</p>
<p>小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。</p>
<p>小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:</p>
<p>+---+</p>
<p>/ /I高</p>
<p>+---+ I</p>
<p>I I +</p>
<p>I I/ 宽</p>
<p>+---+</p>
<p>长</p>
<p>每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”I”表示。字符’+’ ‘-‘’/’ ‘I’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:</p>
<p>若两块积木左右相邻,图示为:</p>
<p>..+---+---+</p>
<p>./ / /I</p>
<p>+---+---+ I</p>
<p>I I I +</p>
<p>I I I/.</p>
<p>+---+---+..</p>
<p>若两块积木上下相邻,图示为:</p>
<p>..+---+</p>
<p>./ /I</p>
<p>+---+ I</p>
<p>I I +</p>
<p>I I/I</p>
<p>+---+ I</p>
<p>I I +</p>
<p>I I/.</p>
<p>+---+..</p>
<p>若两块积木前后相邻,图示为:</p>
<p>….+---+</p>
<p>…/ /I</p>
<p>..+---+ I</p>
<p>./ /I +</p>
<p>+---+ I/.</p>
<p>I I +..</p>
<p>I I/…</p>
<p>+---+….</p>
<p>立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。</p>
<p>【输入】</p>
<p>输入文件drawing.in第一行有用空格隔开的两个整数m和n,表示有m*n个格子(1<=m,n<=50)。</p>
<p>接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。</p>
<p>【输出】</p>
<p>输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。</p>
<p>【输入输出样例】</p>
<p>drawing.in drawing.out</p>
<p>3 4</p>
<p>2 2 1 2</p>
<p>2 2 1 1</p>
<p>3 2 1 2 ......+---+---+...+---+</p>
<p>..+---+ / /I../ /I</p>
<p>./ /I-+---+ I.+---+ I</p>
<p>+---+ I/ /I +-I I +</p>
<p>I I +---+ I/+---+ I/I</p>
<p>I I/ /I +/ /I-+ I</p>
<p>+---+---+ I/+---+ I/I +</p>
<p>I I I +-I I + I/.</p>
<p>I I I/I I/I +..</p>
<p>+---+---+---+---+ I/...</p>
<p>I I I I I +....</p>
<p>I I I I I/.....</p>
<p>+---+---+---+---+......</p>
<p>要用递推实现</p>
<p>一定一定;</p>
<p>还有要讲解详细一点,</p>
<p>思路要清晰;</p>
<p>好就一定有加分</p>
<p>提问者: shmilyjxw - 五级</p>
<p>最佳答案</p>
<p>Pku原题,编号2330</p>
<p>算不上难题,但是比较麻烦,细心点就ok了。</p>
<p>先计算好画布的大小,再写一个根据左下角坐标绘制一个单位立方体的子程序。</p>
<p>然后遵循下面法则,不停绘制若干个立方体。(此处能体现出分割程序的伟大)</p>
<p>因为要不停的覆盖,所以要遵循“视觉法则”:</p>
<p>1.先绘里层再绘外层</p>
<p>2.先绘底层再绘上层</p>
<p>3.先回左边再绘右边</p>
<p>参考程序:</p>
<p>program drawing;</p>
<p>const</p>
<p>inp=\'drawing.in\';</p>
<p>oup=\'drawing.out\';</p>
<p>var</p>
<p>m,n,i,j,k,x,y,h,tmp,maxx,maxy:longint;</p>
<p>map:array of char;//画布</p>
<p>a:array of integer;//记录输入的矩阵</p>
<p>procedure flink;</p>
<p>begin</p>
<p>assign(input,inp);</p>
<p>reset(input);</p>
<p>assign(output,oup);</p>
<p>rewrite(output);</p>
<p>end;</p>
<p>procedure fclose;</p>
<p>begin</p>
<p>close(input);</p>
<p>close(output);</p>
<p>end;</p>
<p>procedure print;//输出画布</p>
<p>var</p>
<p>i,j:longint;</p>
<p>begin</p>
<p>for i:= 1 to maxx do</p>
<p>begin</p>
<p>for j:= 1 to maxy do</p>
<p>write(map);</p>
<p>if i<>maxx then writeln;</p>
<p>end;</p>
<p>end;</p>
<p>proceduredraw(x,y:longint);//在画布(map数组)上绘制左下角坐标为(x,y)的一个单位立方体</p>
<p>begin</p>
<p>map:=\'+\';map:=\'-\'; map:=\'-\';map:=\'-\';map:=\'+\';</p>
<p>dec(x);</p>
<p>map:=\'I\';map:=\' \'; map:=\' \';map:=\' \';map:=\'I\';</p>
<p>map:=\'/\';</p>
<p>dec(x);</p>
<p>map:=\'I\';map:=\' \'; map:=\' \';map:=\' \';map:=\'I\';</p>
<p>map:=\' \';map:=\'+\';</p>
<p>dec(x);</p>
<p>map:=\'+\';map:=\'-\'; map:=\'-\';map:=\'-\';map:=\'+\';</p>
<p>map:=\' \';map:=\'I\';</p>
<p>dec(x);inc(y);</p>
<p>map:=\'/\';map:=\' \'; map:=\' \';map:=\' \';map:=\'/\';</p>
<p>map:=\'I\';</p>
<p>dec(x);inc(y);</p>
<p>map:=\'+\';map:=\'-\'; map:=\'-\';map:=\'-\';map:=\'+\';</p>
<p>end;</p>
<p>begin</p>
<p>flink;</p>
<p>for i:= 1 to 1000 do</p>
<p>for j:= 1 to 1000 do</p>
<p>map:=\'.\'; //初始化画布</p>
<p>readln(m,n);</p>
<p>//计算画布大小maxx * maxy</p>
<p>maxy:=n*4+1+m*2;</p>
<p>maxx:=0;</p>
<p>for i:= 1 to m do</p>
<p>begin</p>
<p>tmp:=0;</p>
<p>for j:= 1 to n do</p>
<p>begin</p>
<p>read(a);</p>
<p>if a>tmp then tmp:=a;</p>
<p>end;</p>
<p>tmp:=tmp*3+3+(m-i)*2;</p>
<p>if tmp >maxx then maxx:=tmp;</p>
<p>readln;</p>
<p>end;</p>
<p>//开始往画布上绘图</p>
<p>for i:= 1 to m do</p>
<p>for j:= 1 to n do</p>
<p>begin</p>
<p>x:=maxx-(m-i)*2;//第i层第j列最下方立方体左下角点的位置(x,y)</p>
<p>y:=(m-i)*2+(j-1)*4+1;</p>
<p>for k:= 1 to a do</p>
<p>draw(x-(k-1)*3,y);//绘制每层的若干个一个单位立方体</p>
<p>end;</p>
<p>print;//输出画布</p>
<p>fclose;</p>
<p>end.</p>
<p>0</p>
<p>回答者:</p>
<p>shihaoze454 - 四级 2009-12-1 22:58</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>xiexie</p>
页:
[1]