[luoguP1058] 立体图(超级大模拟(¬︿̫̿¬☆))

传送门

看到题后整个人成了mengbier

但是仔细分析一下就很简单了,先确定好输出的图的长和宽。

然后从输入的矩形的左上角的最下面的开始填充,顺序是从下到上,从左到右,从后往前。

填充的时候直接覆盖掉原先的就可以。

代码

#include <cstdio>
#include <iostream>
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))

int n, m, N, M;
int a[51][51];
char map[1001][1001];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
	return x * f;
}

inline void print(int i, int j, int k)
{
	int x, y;
	x = (n - i) * 2 + (k - 1) * 3 + 1;
	y = (n - i) * 2 + (j - 1) * 4 + 1;
	
	map[x + 4][y + 1] = '/';
	map[x + 4][y + 5] = '/';
	map[x + 1][y + 5] = '/';
	
	map[x][y] = '+';
	map[x + 3][y] = '+';
	map[x][y + 4] = '+';
	map[x + 3][y + 4] = '+';
	map[x + 5][y + 2] = '+';
	map[x + 5][y + 6] = '+';
	map[x + 2][y + 6] = '+';
	
	for(i = y + 3; i <= y + 5; i++) map[x + 5][i] = '-';
	for(i = y + 1; i <= y + 3; i++) map[x][i] = '-', map[x + 3][i] = '-';
	
	for(i = x + 3; i <= x + 4; i++) map[i][y + 6] = '|';
	for(i = x + 1; i <= x + 2; i++) map[i][y] = '|', map[i][y + 4] = '|';
	
	for(i = x + 1; i <= x + 2; i++)
		for(j = y + 1; j <= y + 3; j++)
			map[i][j] = ' ';
	for(i = y + 2; i <= y + 4; i++) map[x + 4][i] = ' ';
	for(i = x + 2; i <= x + 3; i++) map[i][y + 5] = ' ';
}

int main()
{
	int i, j, k;
	n = read();
	m = read();
	for(i = 1; i <= n; i++)
		for(j = 1; j <= m; j++)
		{
			a[i][j] = read();
			N = max(N, (n - i) * 2 + a[i][j] * 3 + 3);
		}
	M = 4 * m + 2 * n + 1;
	for(i = 1; i <= N; i++)
		for(j = 1; j <= M; j++)
			map[i][j] = '.';
	for(i = 1; i <= n; i++)
		for(j = 1; j <= m; j++)
			for(k = 1; k <= a[i][j]; k++)
				print(i, j, k);
	for(i = N; i >= 1; puts(""), i--)
		for(j = 1; j <= M; j++)
			putchar(map[i][j]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/zhenghaotian/p/7085256.html