[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;
}

浙公网安备 33010602011771号