感觉看懂题意并不难,但是对应好 x,y,zx,y,z 轴,以及看懂出题人的神奇样例解释真的挺困难。

那么我们可以从 输出格式 开始下手,首先他给我们的输出顺序是:

  • 正视图(Y\mathbf YX\mathbf X 列)
  • 左视图(Y\mathbf YZ\mathbf Z 列)
  • 俯视图(Z\mathbf ZX\mathbf X 列)

据此,我们得知了每一张图的尺寸,所以所谓输入的 xi,yi,zix_i,y_i,z_i 分别对上述的哪种图产生贡献,由于相同的取值范围,我们也就看明白了。

但是直接这样模拟会出点问题,那就是在代码的第 3030 行,Y\mathbf Y 轴坐标需要翻转一下,那么这个东西如何理解呢?

还是那句话,看不懂样例并不一定影响我们 AC 这道题,既然输出的结果看起来就需要被“镜像”一下,我们不妨就枚举 23=82^3=8 种可能性,把每一个坐标轴对应的坐标翻转一下,最坏第 88 次也能试出来!

最后就是直接根据我们看到的来输出就可以,所谓看到什么,就输出什么,实际上就是对应每一个面的某一个坐标,如果上面有点,就输出 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]);
}