这题是看了题解做的...
背景 Background
NOIP2008复赛普及组第四题
提示:如果在vj中排版乱了,可以复制到文本文档里查看!
提示:如果在vj中排版乱了,可以复制到文本文档里查看!
描述 Description
小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
+---+
/ /|
+---+ |
| | +
| |/
+---+
每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’ ‘-‘’/’ ‘|’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
..+---+---+
./ / /|
+---+---+ |
| | | +
| | |/.
+---+---+..
若两块积木上下相邻,图示为:
..+---+
./ /|
+---+ |
| | +
| |/|
+---+ |
| | +
| |/.
+---+..
若两块积木前后相邻,图示为:
....+---+
.../ /|
..+---+ |
./ /| +
+---+ |/.
| | +..
| |/...
+---+....
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的吉姆(积木的长宽高都是1),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:
+---+
/ /|
+---+ |
| | +
| |/
+---+
每个顶点用1个加号’+’表示,长用3个”-“表示,宽用1个”/”表示,高用两个”|”表示。字符’+’ ‘-‘’/’ ‘|’的ASCII码分别为43,45,47,124。字符’.’(ASCII码46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画法如下面的规则:
若两块积木左右相邻,图示为:
..+---+---+
./ / /|
+---+---+ |
| | | +
| | |/.
+---+---+..
若两块积木上下相邻,图示为:
..+---+
./ /|
+---+ |
| | +
| |/|
+---+ |
| | +
| |/.
+---+..
若两块积木前后相邻,图示为:
....+---+
.../ /|
..+---+ |
./ /| +
+---+ |/.
| | +..
| |/...
+---+....
立体图中,定义位于第(m,1)的格子(即第m行第1列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
输入格式 InputFormat
输入文件drawing.in第一行有用空格隔开的两个整数m和n,表示有m*n个格子(1<=m,n<=50)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1<=每个格子上的积木数<=100)。
输出格式 OutputFormat
输出文件drawing.out中包含题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。
代码:
01 | #include <stdio.h> |
02 | #include <iostream> |
03 | #include <algorithm> |
04 | #include<memory.h> |
05 | using namespace std; |
06 | char map[501][501]; |
07 | char ff[8][8]={ |
08 | "..+---+" , |
09 | "./ /|" , |
10 | "+---+ |" , |
11 | "| | +" , |
12 | "| |/." , |
13 | "+---+.." }; |
14 | int wei[51][51]; |
15 | int max( int x, int y) |
16 | { return (x>y ? x:y);} |
17 |
18 | void paint( int x, int y) |
19 | { |
20 | for ( int i=0;i<6;i++) |
21 | for ( int j=0;j<=6;j++) |
22 | if (ff[i][j]!= '.' ) //记得画积木时只要画出积木的实体就行了 |
23 | map[x+i-5][y+j]=ff[i][j]; |
24 | } |
25 | int main() |
26 | { |
27 | |
28 | int i,j,k; |
29 | int m,n; int width,high; |
30 | while ( scanf ( "%d %d" ,&m,&n)!=EOF) |
31 | { |
32 | high=0; |
33 | for (i=1;i<=m;i++) |
34 | for (j=1;j<=n;j++) |
35 | { |
36 | scanf ( "%d" ,&wei[i][j]); |
37 | high=max(high,(m-i)*2+wei[i][j]*3+3); |
38 | } |
39 | //首先是输入各个位置上的方块数目; |
40 | //算出宽和高; |
41 | width=n*4+m*2+1; |
42 | |
43 | memset (map, '.' , sizeof (map)); |
44 | //初始化为'.'; |
45 |
46 | for (i=1;i<=m;i++) |
47 | for (j=1;j<=n;j++) |
48 | for (k=0;k<wei[i][j];k++) |
49 | { |
50 | //求出每个积木的左下角的字符的坐标(x,y) |
51 | int x,y; |
52 | x=high-(m-i)*2-3*k; |
53 | y=(j-1)*4+(m-i)*2+1; |
54 | //画出积木 |
55 | paint(x,y); |
56 | } |
57 | for (i=1;i<=high;i++) |
58 | { |
59 | for (j=1;j<=width;j++) |
60 | printf ( "%c" ,map[i][j]); |
61 | printf ( "\n" ); |
62 | } |
63 | } |
64 | return 0; |
65 | } |