回 帖 发 新 帖 刷新版面

主题:求助此题代码

4.立体图
 (drawing.pas/c/cpp)
【问题描述】
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为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    ......+---+---+...+---+
..+---+   /    /|../   /|
./    /|-+---+ |.+---+ |
+---+ |/   /| +-|    | +
|    | +---+ |/+---+ |/|
|    |/   /| +/    /|-+ |
+---+---+ |/+---+ |/| +
|    |   | +-|    | + |/.
|    |   |/  |    |/| +..
+---+---+---+---+ |/...
|    |   |    |   | +....
|    |   |    |   |/.....
+---+---+---+---+......

回复列表 (共1个回复)

沙发

弱题来的:

const
     graph:array[0..5,0..7]of char=
     ('  +---+',
      ' /   /|',
      '+---+ |',
      '|   | +',
      '|   |/ ',
      '+---+  ');
     s:array[0..5]of longint=(2,1,0,0,0,0);
     t:array[0..5]of longint=(6,6,6,6,5,4);
     maxn=100;
     S2=50;

var ans:array[0..maxn,0..maxn]of char;
    n,m,W,H,WW,HH:longint;
    g:array[0..maxn,0..maxn]of longint;

function max(a,b:longint):longint;
begin
     if a>b then max:=a else max:=b;
end;
function min(a,b:longint):longint;
begin
     if a<b then min:=a else min:=b;
end;
procedure make(x,y,z:longint);
var i,j,sx,sy:longint;
begin
     sx:= S2 - (n - x - 1) * 2 - 3 * z;
     sy:= S2 - (m - y - 1) * 4 + (n - x - 1) * 2;
  for i:=0 to 5 do
    for j:= s[i] to t[i] do
      if (ans[sx + i][sy + j]='.') then
begin
   ans[sx + i][sy + j]:= graph[i][j];
   W :=max(w, sx + i);WW :=min(ww, sx + i);
   H :=max(h, sy + j);HH :=min(hh, sy + j);
end;
end;

var i,j,k:longint;
begin
     readln(n,m);
  for i:= 0 to n-1 do
    for j:= 0 to m-1 do
      read(g[i][j]);
  W:= 0;WW:= Maxn;
  H:= 0;HH:= Maxn;
  fillchar(ans,sizeof(ans),'.');
  for i:= n - 1 downto  0 do
    for j:= m - 1 downto 0  do
      for k:= g[i][j] - 1 downto 0  do
make(i , j , k);
    for i:= WW to W  do
    begin
      for j:= HH to H do
          write(ans[i][j]);
      writeln;
    end;
    readln;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册