在Vijos上编译成功
测试数据 #0: Accepted, time = 0 ms, mem = 1340 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 1336 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 1336 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 1328 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 1336 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 1332 KiB, score = 10
测试数据 #6: Accepted, time = 15 ms, mem = 1336 KiB, score = 10
测试数据 #7: Accepted, time = 0 ms, mem = 1340 KiB, score = 10
测试数据 #8: Accepted, time = 0 ms, mem = 1332 KiB, score = 10
测试数据 #9: Accepted, time = 0 ms, mem = 1336 KiB, score = 10
Accepted, time = 15 ms, mem = 1340 KiB, score = 100
这道题看起来比较难,但实际上还是比较简单的。
首先我们要画出来一个立方体。
void draw(int x, int y) { int i, j; for(i = y + 1; i < y + 4; i++) canvas[x][i] = canvas[x - 3][i] = canvas[x - 5][i + 2] = '-'; for(i = x - 1; i > x - 3; i--) canvas[i][y] = canvas[i][y + 4] = canvas[i - 2][y + 6] = '|'; for(i = x - 1; i > x - 3; i--) for(j = y + 1; j < y + 4; j++) canvas[i][j] = ' '; for(i = x - 2; i > x - 4; i--) canvas[i][y + 5] = ' '; for(i = y + 2; i < y + 5; i++) canvas[x - 4][i] = ' '; canvas[x][y] = canvas[x - 3][y] = canvas[x][y + 4] = canvas[x - 3][y + 4] = '+'; canvas[x - 4][y + 1] = canvas[x - 4][y + 5] = canvas[x - 1][y + 5] = '/'; canvas[x - 5][y + 2] = canvas[x - 5][y + 6] = canvas[x - 2][y + 6] = '+'; }
实际上也可以用常量定义立方体,然后复制到数组里。
然后我们要确定画布的长和宽。
长比较好求,因为每个格子都回至少有1个立方体,现在就是要确定宽。
width = 4 * n + 1 + 2 * m; height = 0; for(i = 1; i <= m; i++) for(j = 1; j <= n; j++) height = max(height, hei[i][j] * 3 + 1 + 2 * (m - i) + 2);
hei是每个格子的高度。
height是宽,width是长。
然后初始化画布。
现在就是在哪里画立方体。
for(i = 1; i <= m; i++) for(j = 1; j <= n; j++) { for(k = 1; k <= hei[i][j]; k++) draw(height - 2 * (m - i) - ((k-1)*3), 4 * (j - 1) + 1 + (m - i) * 2); }
i和j是格子的坐标,k是格子的高度
height-2*(m-i)-((k-1)*3)表示x坐标,4*(j-1)+1+(m-i)*2表示y坐标。
最后打印画布即可。
#include <stdio.h> #define max(a,b) (a)>(b)?(a):(b) #define M 50 #define N 50 int n, m; int i, j, k; int p, q; int width, height; int hei[M][N]; char canvas[900][900]; void draw(int x, int y) { int i, j; for(i = y + 1; i < y + 4; i++) canvas[x][i] = canvas[x - 3][i] = canvas[x - 5][i + 2] = '-'; for(i = x - 1; i > x - 3; i--) canvas[i][y] = canvas[i][y + 4] = canvas[i - 2][y + 6] = '|'; for(i = x - 1; i > x - 3; i--) for(j = y + 1; j < y + 4; j++) canvas[i][j] = ' '; for(i = x - 2; i > x - 4; i--) canvas[i][y + 5] = ' '; for(i = y + 2; i < y + 5; i++) canvas[x - 4][i] = ' '; canvas[x][y] = canvas[x - 3][y] = canvas[x][y + 4] = canvas[x - 3][y + 4] = '+'; canvas[x - 4][y + 1] = canvas[x - 4][y + 5] = canvas[x - 1][y + 5] = '/'; canvas[x - 5][y + 2] = canvas[x - 5][y + 6] = canvas[x - 2][y + 6] = '+'; } int main() { scanf("%d%d", &m, &n); for(i = 1; i <= m; i++) for(j = 1; j <= n; j++) scanf("%d", &hei[i][j]); width = 4 * n + 1 + 2 * m; height = 0; for(i = 1; i <= m; i++) for(j = 1; j <= n; j++) height = max(height, hei[i][j] * 3 + 1 + 2 * (m - i) + 2); for(i = 1; i <= height; i++) for(j = 1; j <= width; j++) canvas[i][j] = '.'; for(i = 1; i <= m; i++) for(j = 1; j <= n; j++) { for(k = 1; k <= hei[i][j]; k++) draw(height - 2 * (m - i) - ((k-1)*3), 4 * (j - 1) + 1 + (m - i) * 2); } for(p = 1; p <= height; p++) { for(q = 1; q <= width; q++) putchar(canvas[p][q]); putchar('\n'); } return 0; }