襄阳城 发表于 2009-12-10 12:36:14

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>/   /&#73;高</p>
<p>+---+ &#73;</p>
<p>&#73;   &#73; +</p>
<p>&#73;   &#73;/ 宽</p>
<p>+---+</p>
<p>长</p>
<p>每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”&#73;”表示。字符’+’ ‘-‘’/’ ‘&#73;’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:</p>
<p>若两块积木左右相邻,图示为:</p>
<p>..+---+---+</p>
<p>./   /   /&#73;</p>
<p>+---+---+ &#73;</p>
<p>&#73;   &#73;   &#73; +</p>
<p>&#73;   &#73;   &#73;/.</p>
<p>+---+---+..</p>
<p>若两块积木上下相邻,图示为:</p>
<p>..+---+</p>
<p>./   /&#73;</p>
<p>+---+ &#73;</p>
<p>&#73;   &#73; +</p>
<p>&#73;   &#73;/&#73;</p>
<p>+---+ &#73;</p>
<p>&#73;   &#73; +</p>
<p>&#73;   &#73;/.</p>
<p>+---+..</p>
<p>若两块积木前后相邻,图示为:</p>
<p>….+---+</p>
<p>…/   /&#73;</p>
<p>..+---+ &#73;</p>
<p>./   /&#73; +</p>
<p>+---+ &#73;/.</p>
<p>&#73;   &#73; +..</p>
<p>&#73;   &#73;/…</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>..+---+   /    /&#73;../   /&#73;</p>
<p>./    /&#73;-+---+ &#73;.+---+ &#73;</p>
<p>+---+ &#73;/   /&#73; +-&#73;    &#73; +</p>
<p>&#73;    &#73; +---+ &#73;/+---+ &#73;/&#73;</p>
<p>&#73;    &#73;/   /&#73; +/    /&#73;-+ &#73;</p>
<p>+---+---+ &#73;/+---+ &#73;/&#73; +</p>
<p>&#73;    &#73;   &#73; +-&#73;    &#73; + &#73;/.</p>
<p>&#73;    &#73;   &#73;/&#73;    &#73;/&#73; +..</p>
<p>+---+---+---+---+ &#73;/...</p>
<p>&#73;    &#73;   &#73;    &#73;   &#73; +....</p>
<p>&#73;    &#73;   &#73;    &#73;   &#73;/.....</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:=\'&#73;\';map:=\' \'; map:=\' \';map:=\' \';map:=\'&#73;\';</p>
<p>map:=\'/\';</p>
<p>dec(x);</p>
<p>map:=\'&#73;\';map:=\' \'; map:=\' \';map:=\' \';map:=\'&#73;\';</p>
<p>map:=\' \';map:=\'+\';</p>
<p>dec(x);</p>
<p>map:=\'+\';map:=\'-\'; map:=\'-\';map:=\'-\';map:=\'+\';</p>
<p>map:=\' \';map:=\'&#73;\';</p>
<p>dec(x);inc(y);</p>
<p>map:=\'/\';map:=\' \'; map:=\' \';map:=\' \';map:=\'/\';</p>
<p>map:=\'&#73;\';</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]
查看完整版本: noip2008第四题立体图(pascal语言)