/*题目描述 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
……+—+—+…+—+
..+—+../ /|../ /|
./ /|-+—+ |.+—+ |
+—+ |/ /| +-| | +
| | +—+ |/+—+ |/|
| |/ /| +/ /|-+ |
+—+—+ |/+—+ |/| +
| | | +-| | + |/.
| | |/ | |/| +..
+—+—+—+—+ |/…
| | | | | +….
| | | | |/…..
+—+—+—+—+……*/
23333来填一个旧坑。
首先要根据矩阵预处理出这个图的高和宽。
然后根据它是第几行第几列处理出在哪里放这个方块。
#include<cstdio>
#include<iostream>
using namespace std;
int n;
int m;
int num[100][100];
char map[1000][1000];
int gao,kuan;
int getgao(int i,int j,int x)
{
int ans=0;
ans+=(x+1)*3;
ans+=(n-i)*2;
return ans;
}
int getkuan(int i,int j)
{
int ans=0;
ans+=(n-i+1)*2;
ans+=(j*4)+1;
return ans;
}
void fang1(int x,int y)
{
/*map[x-5][y]='.',map[x-5][y+1]='.'*/map[x-5][y+2]='+',map[x-5][y+3]='-',map[x-5][y+4]='-',map[x-5][y+5]='-',map[x-5][y+6]='+';
/*map[x-4][y]='.'*/map[x-4][y+1]='/',map[x-4][y+2]=' ',map[x-4][y+3]=' ',map[x-4][y+4]=' ',map[x-4][y+5]='/',map[x-4][y+6]='|';
map[x-3][y]='+',map[x-3][y+1]='-',map[x-3][y+2]='-',map[x-3][y+3]='-',map[x-3][y+4]='+',map[x-3][y+5]=' ',map[x-3][y+6]='|';
map[x-2][y]='|',map[x-2][y+1]=' ',map[x-2][y+2]=' ',map[x-2][y+3]=' ',map[x-2][y+4]='|',map[x-2][y+5]=' ',map[x-2][y+6]='+';
map[x-1][y]='|',map[x-1][y+1]=' ',map[x-1][y+2]=' ',map[x-1][y+3]=' ',map[x-1][y+4]='|',map[x-1][y+5]='/'/*,map[x-1][y+6]='.'*/;
map[x][y]='+',map[x][y+1]='-',map[x][y+2]='-',map[x][y+3]='-',map[x][y+4]='+'/*map[x][y+5]='.',map[x][y+6]='.'*/;
}
void fang(int x,int y,int cnt)
{
int xx=gao-(n-x)*2;
int yy=(n-x)*2+1+(y-1)*4;
while(cnt>=1)
{
fang1(xx,yy);
xx-=3;
cnt--;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&num[i][j]);
gao=max(getgao(i,j,num[i][j]),gao);
kuan=max(getkuan(i,j),kuan);
}
}
for(int i=1;i<=gao;i++)
for(int j=1;j<=kuan;j++)
map[i][j]='.';
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
fang(i,j,num[i][j]);
}
}
// printf("%d %d\n",gao,kuan);
for(int i=1;i<=gao;i++)
{
for(int j=1;j<=kuan;j++)
{
printf("%c",map[i][j]);
}
puts("");
}
return 0;
}