zoukankan      html  css  js  c++  java
  • 1149 立体图 2008年NOIP全国联赛普及组

    题目描述 Description

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

    小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

      +---+

     /   /|  高

    +---+ |

    |   | +

    |   |/ 宽

    +---+

     长

    每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’ ‘-‘’/’ ‘|’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:

    若两块积木左右相邻,图示为:

    ..+---+---+

    ./   /   /|

    +---+---+ |

    |   |   | +

    |   |   |/.

    +---+---+..

    若两块积木上下相邻,图示为:

    ..+---+

    ./   /|

    +---+ |

    |   | +

    |   |/|

    +---+ |

    |   | +

    |   |/.

    +---+..

    若两块积木前后相邻,图示为:

    ….+---+

    …/   /|

    ..+---+ |

    ./   /| +

    +---+ |/.

    |   | +..

    |   |/…

    +---+….

    立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。

    输入描述 Input Description

    输入文件drawing.in第一行有用空格隔开的两个整数m和n,表示有m*n个格子(1<=m,n<=50)。

    接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。

    输出描述 Output Description

    输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。

    样例输入 Sample Input

    3 4

    2 2 1 2

    2 2 1 1

    3 2 1 2

    样例输出 Sample Output

    ......+---+---+...+---+

    ..+---+   /    /|../   /|

    ./    /|-+---+ |.+---+ |

    +---+ |/   /| +-|    | +

    |    | +---+ |/+---+ |/|

    |    |/   /| +/    /|-+ |

    +---+---+ |/+---+ |/| +

    |    |   | +-|    | + |/.

    |    |   |/  |    |/| +..

    +---+---+---+---+ |/...

    |    |   |    |   | +....

    |    |   |    |   |/.....

    +---+---+---+---+......


    思路:这道题是从后面到前面,从左边到右边,从下面到上面,找到每个方块的左下角的点,进行覆盖,很简单

     1 /*
     2     恶心的模拟 
     3     主要的是 从题目给定的n行m列中
     4     找出立体图的k行l列
     5     在找每个小立方体的左下角
     6     从后向前打印
     7     从左向右打印 
     8     从下向上打印
     9     
    10     一定要注意 空格也要打印上去 
    11 */
    12 #include<cstdio>
    13 #include<cstring>
    14 #include<iostream>
    15 #define MAXN 1010
    16 
    17 using namespace std;
    18 
    19 int n,m,k,l;
    20 
    21 char map[MAXN][MAXN];
    22 
    23 int a[MAXN][MAXN];
    24 
    25 inline void read(int&x) {
    26     x=0;int f=1;char c=getchar();
    27     while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    28     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-48;c=getchar();}
    29     x=x*f;
    30 }
    31 
    32 inline void yin(int x,int y) {
    33       map[x][y]='+';
    34       map[x-1][y]=map[x-2][y]='|';
    35       map[x-3][y]='+';
    36       map[x-4][y+1]='/';
    37       map[x-5][y+2]='+';
    38       map[x-5][y+3]=map[x-5][y+4]='-';
    39       map[x-5][y+5]='-';
    40       map[x-5][y+6]='+';
    41       map[x-3][y+1]=map[x-3][y+2]='-';
    42     map[x-3][y+3]='-';map[x-3][y+4]='+';
    43     map[x-4][y+5]='/';
    44     map[x-1][y+4]=map[x-2][y+4]='|';
    45       map[x][y+1]=map[x][y+2]='-';
    46     map[x][y+3]='-';map[x][y+4]='+';
    47     map[x-1][y+5]='/';
    48     map[x-2][y+6]='+';
    49     map[x-3][y+6]=map[x-4][y+6]='|';
    50       map[x-1][y+1]=map[x-1][y+2]=map[x-1][y+3]=' ';
    51       map[x-2][y+1]=map[x-2][y+2]=map[x-2][y+3]=' ';
    52       map[x-4][y+4]=map[x-4][y+2]=map[x-4][y+3]=' ';
    53       map[x-2][y+5]=' ';
    54       map[x-3][y+5]=' ';
    55     return;
    56 }
    57 
    58 int main() {
    59     read(n);read(m);
    60     memset(map,'.',sizeof map);
    61     //处理要打印的立体图的k行l列 
    62     l=5*m-(m-1)+n*3-(n-1)-1;
    63     for(int i=1;i<=n;i++) {
    64         int t=0; 
    65         for(int j=1;j<=m;j++) {
    66               read(a[i][j]);
    67               t=max(t,a[i][j]);
    68           }
    69           k=max(k+2,t*4-(t-1)+2);
    70     }
    71     //打印立体图 
    72     for(int i=1;i<=n;i++)
    73       for(int j=1;j<=m;j++) {
    74           int x=k-2*(n-i);
    75           int y=4*(j-1)+1+(n-i)*2;
    76           for(int p=1;p<=a[i][j];p++) 
    77             yin(x-(p-1)*3,y);
    78       }
    79     for(int i=1;i<=k;i++) {
    80         for(int j=1;j<=l;j++)
    81           if(map[i][j]!='') cout<<map[i][j];
    82           else cout<<'.';
    83         printf("
    ");
    84     }
    85     return 0;
    86 }
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    select poll使用
    linux下tomcat shutdown后 java进程依然存在
    poj 1222 EXTENDED LIGHTS OUT(高斯消元)
    poj 2377 Bad Cowtractors
    C#:总结页面传值几种方法
    从 Racket 入门函数式编程
    程序猿接私活经验总结,来自csdn论坛语录
    什么是SEO?SEO干嘛的?怎么做SEO?
    Java设计模式-观察者模式
    非常特别的一个动态规划新手教程
  • 原文地址:https://www.cnblogs.com/whistle13326/p/6358366.html
Copyright © 2011-2022 走看看