感觉看懂题意并不难,但是对应好 轴,以及看懂出题人的神奇样例解释真的挺困难。
那么我们可以从 输出格式 开始下手,首先他给我们的输出顺序是:
- 正视图( 行 列)
- 左视图( 行 列)
- 俯视图( 行 列)
据此,我们得知了每一张图的尺寸,所以所谓输入的 分别对上述的哪种图产生贡献,由于相同的取值范围,我们也就看明白了。
但是直接这样模拟会出点问题,那就是在代码的第 行, 轴坐标需要翻转一下,那么这个东西如何理解呢?
还是那句话,看不懂样例并不一定影响我们 AC 这道题,既然输出的结果看起来就需要被“镜像”一下,我们不妨就枚举 种可能性,把每一个坐标轴对应的坐标翻转一下,最坏第 次也能试出来!
最后就是直接根据我们看到的来输出就可以,所谓看到什么,就输出什么,实际上就是对应每一个面的某一个坐标,如果上面有点,就输出 x
否则输出 .
,每一次输入就看做一次染色即可。
#include<cstdio>
int init(){
char c = getchar();
int x = 0, f = 1;
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') f = -1;
for (; c >= '0' && c <= '9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
return x * f;
}
void print(int x){
if (x < 0) x = -x, putchar('-');
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
}
const int MAXN = (int) 1e3 + 5;
char X[MAXN][MAXN], Y[MAXN][MAXN], Z[MAXN][MAXN];
int main(){
int MAXX = init(), MAXY = init(), MAXZ = init(), N = init();
for (int i = 1; i <= MAXY; ++i)
for (int j = 1; j <= MAXX; ++j)
Z[i][j] = '.';
for (int i = 1; i <= MAXY; ++i)
for (int j = 1; j <= MAXZ; ++j)
X[i][j] = '.';
for (int i = 1; i <= MAXZ; ++i)
for (int j = 1; j <= MAXX; ++j)
Y[i][j] = '.';
for (int i = 1; i <= N; ++i) {
int x = init(), y = MAXY + 1 - init(), z = init();
Z[y][x] = X[y][z] = Y[z][x] = 'x';
}
for (int i = 1; i <= MAXY; ++i, putchar('\n')) {
for (int j = 1; j <= MAXX; ++j)
putchar(Z[i][j]);
putchar(' ');
for (int j = 1; j <= MAXZ; ++j)
putchar(X[i][j]);
}
putchar('\n');
for (int i = 1; i <= MAXZ; ++i, putchar('\n'))
for (int j = 1; j <= MAXX; ++j)
putchar(Y[i][j]);
}