zoukankan      html  css  js  c++  java
  • 立体图

    题目描述

    小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。

    小渊有一块面积为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:
    ......+---+---+...+---+
    ..+---+  /   /|../   /|
    ./   /|-+---+ |.+---+ |
    +---+ |/   /| +-|   | +
    |   | +---+ |/+---+ |/|
    |   |/   /| +/   /|-+ |
    +---+---+ |/+---+ |/| +
    |   |   | +-|   | + |/.
    |   |   |/  |   |/| +..
    +---+---+---+---+ |/...
    |   |   |   |   | +....
    |   |   |   |   |/.....
    +---+---+---+---+......

    说明

    NOIP2008普及组第四题

    代码实现:

     1 #include<cstdio>
     2 int m,n,a,h,l;
     3 char t[3000][3000];
     4 void coated(int x,int y){
     5     t[x][y]='+',t[x][y+1]='-',t[x][y+2]='-',t[x][y+3]='-',t[x][y+4]='+';x++;
     6     t[x][y]='|',t[x][y+1]=' ',t[x][y+2]=' ',t[x][y+3]=' ',t[x][y+4]='|',t[x][y+5]='/';x++;
     7     t[x][y]='|',t[x][y+1]=' ',t[x][y+2]=' ',t[x][y+3]=' ',t[x][y+4]='|',t[x][y+5]=' ',t[x][y+6]='+';x++;
     8     t[x][y]='+',t[x][y+1]='-',t[x][y+2]='-',t[x][y+3]='-',t[x][y+4]='+',t[x][y+5]=' ',t[x][y+6]='|';x++;
     9     t[x][y+1]='/',t[x][y+2]=' ',t[x][y+3]=' ',t[x][y+4]=' ',t[x][y+5]='/',t[x][y+6]='|';x++;
    10     t[x][y+2]='+',t[x][y+3]='-',t[x][y+4]='-',t[x][y+5]='-',t[x][y+6]='+';
    11 }
    12 int main(){
    13     scanf("%d%d",&m,&n);
    14     for(int i=1;i<=m;i++){
    15         for(int j=1;j<=n;j++){
    16             scanf("%d",&a);
    17             if(((m-i)*2+a*3+2)>h) h=(m-i)*2+a*3+2;
    18             if(((m-i)*2+(j-1)*4+6)>l) l=(m-i)*2+(j-1)*4+6;
    19             for(int k=1;k<=a;k++){
    20                 coated((m-i)*2+(k-1)*3,(m-i)*2+(j-1)*4);
    21             }
    22         }
    23     }
    24     for(int i=h;i>=0;i--){
    25         for(int j=0;j<=l;j++){
    26             if(t[i][j]) printf("%c",t[i][j]);
    27             else printf(".");
    28         }
    29         printf("
    ");
    30     }
    31     return 0;
    32 }

    新的覆盖旧的即可。

    题目来源:洛谷

  • 相关阅读:
    Linux进程管理概述
    【反转单链表】一篇就够了
    线性数据结构
    Linux的su和sudo有什么区别?如何使用?
    关于CentOS切换中文输入法的问题
    MySQL 初识
    MySQL 增-删-改操作
    数据库简介
    MySQL 查询操作
    HANDLER Statement
  • 原文地址:https://www.cnblogs.com/J-william/p/6361158.html
Copyright © 2011-2022 走看看