看到题后整个人成了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; }