https://www.luogu.org/problemnew/show/P1058
应该说就是找规律然后计算坐标,由于覆盖的问题在画图的时候注意顺序可以省去不必要的麻烦.
感觉还挺好看的,放个样例:
INPUT
3 4
2 2 1 2
2 2 1 1
3 2 1 2
OUTPUT
......+---+---+...+---+
..+---+ / /|../ /|
./ /|-+---+ |.+---+ |
+---+ |/ /| +-| | +
| | +---+ |/+---+ |/|
| |/ /| +/ /|-+ |
+---+---+ |/+---+ |/| +
| | | +-| | + |/.
| | |/ | |/| +..
+---+---+---+---+ |/...
| | | | | +....
| | | | |/.....
+---+---+---+---+......
代码
#include <bits/stdc++.h>
using namespace std;
const char cube[6][8] = {
"..+---+",
"./ /|",
"+---+ |",
"| | +",
"| |/.",
"+---+.."
};
int a[55][55], mp[550][550];
inline void paint(int x, int y)
{
for (int i = 0; i < 6; ++i)
for (int j = 0; j < 7; ++j)
if (cube[6-i-1][j] != '.')
mp[x-i][y+j] = cube[6-i-1][j];
}
int main()
{
int n, m, k = 0, l;
cin >> n >> m;
l = 4*m + 2*n + 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
scanf("%d", &a[i][j]);
k = max(k, 3*a[i][j] + 2*(n-i+1) + 1);
}
for (int i = 1; i <= k; ++i)
for (int j = 1; j <= l; ++j)
mp[i][j] = '.';
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
int x = k - 2*(n-i), y = 2*(n-i) + 4*(j-1) + 1;
while (a[i][j]--)
paint(x, y), x -= 3;
}
for (int i = 1; i <= k; ++i)
{
for (int j = 1; j <= l; ++j)
putchar(mp[i][j]);
puts("");
}
return 0;
}