列表

详情


NC16620. [NOIP2008]立体图

描述

小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。
小渊有一块面积为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 ≤ m,n ≤ 50)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1 ≤ 每个格子上的积木 ≤ 100)。

输出描述

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

示例1

输入:

3 4
2 2 1 2
2 2 1 1
3 2 1 2

输出:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 512K, 提交时间: 2019-10-20 18:40:59

#include<bits/stdc++.h>
using namespace std;
int n,m,f[55][55],X,Y;
char biao[10][10]={  
"  +---+",
" /   /|",
"+---+ |",
"|   | +",
"|   |/",
"+---+",
};
int l[6]={2,1,0,0,0,0},r[6]={6,6,6,6,5,4};
char ans[1001][1001];
void fugai(int x,int y)
{
	for(int i=5;i>=0;i--)
	{
		for(int j=l[i];j<=r[i];j++)
		{
			ans[5-i+x][j+y]=biao[i][j];
			X=max(X,5-i+x);
			Y=max(j+y,Y);
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=0;j<m;j++)
	cin>>f[i][j];
	for(int i=1;i<=n;i++)
	for(int j=0;j<m;j++)
	for(int k=0;k<f[i][j];k++)
	{
		fugai((n-i)*2+1+3*k,(n-i)*2+1+4*j);
	}
	for(int i=X;i>=1;i--)
	{
		for(int j=1;j<=Y;j++)
		{
			if(ans[i][j]=='\0')
			printf(".");
			else
			printf("%c",ans[i][j]);
		}
		printf("\n");
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 1380K, 提交时间: 2019-10-19 08:14:55

#include<bits/stdc++.h>
using namespace std;
char ans[1005][1005];
char unit[10][10]= {
	"..+---+",
	"./   /|",
	"+---+ |",
	"|   | +",
	"|   |/.",
	"+---+..",
};
void plant(int sx,int sy) {
	for(int i=0; i<6; i++)
		for(int j=0; j<7; j++)
			if(unit[i][j]!='.')
				ans[sx+i][sy+j]=unit[i][j];
}
int main() {
	memset(ans,'.',sizeof(ans));
	int n,m,w,l=0;
	cin>>m>>n;
	int uper[m][n];
	w=n*4+1+m*2;
	for(int i=0; i<m; i++)
		for(int j=0; j<n; j++) {
			cin>>uper[i][j];
			l=max(l,uper[i][j]*3+1+(m-i)*2);
		}
	for(int i=0; i<m; i++)
		for(int j=0; j<n; j++)
			for(int k=1; k<=uper[i][j]; k++)
				plant(l-(k*3)-2*(m-i),j*4+1+(m-i-1)*2);
	for(int i=1; i<=l; i++) {
		for(int j=1; j<=w; j++)
			cout<<ans[i][j];
		cout<<endl;
	}
	return 0;
}

上一题