UVA1030 题解

思路分析

猜想

我们可以在题目中看出一下几个突破口:

  • 能“看穿”的位置所对应的单位立方体是一定不存在的。
  • 如果前视图的右上角的颜色 \(A\) 和顶视图的的右下角颜色 \(B\) 不同,那么对应的格子就一定不存在

在删除这个立方体后,我们还可以发现,挖去立方体的左侧和 \(B\) 左侧的颜色不同。这样,我们又能删除一个新的立方体,并且暴露出新的表面。当无法继续删除时,剩下的立方体就是质量最大的物体。

证明

为什么上面的猜想是正确的呢?

首先,不难证明第一次删除行为是必要的(即被删除的那个立方体不可能存在于任意可行解中),因为只要不删除这个立方体,对应的两个视图的“矛盾”将会一直存在;接下来,我们可以用数学归纳法来证明。我们假设算法的前 \(k\) 次删除时必要的,那么第 \(k+1\) 次删除是否也是必要的呢?由刚才的推理,我们不能通过继续删除立方体来消除矛盾,而由归纳假设,已经删除的立方体也不能回复,因此矛盾无法消除。

代码实现

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
using namespace std;
const int MAXN = 15;
int n;
char pos[MAXN][MAXN][MAXN], view[6][MAXN][MAXN];
char read() {
	char ch;
	while (true) {
		ch = getchar();
		if ((ch >= 'A' && ch <= 'Z') || ch == '.') return ch;
	}
}
void get(int op, int i, int j, int len, int &x, int &y, int &z) {
	switch (op) {
	case 0:
		x = len, y = j, z = i;
		break;
	case 1:
		x = n - 1 - j, y = len, z = i;
		break;
	case 2:
		x = n - 1 - len, y = n - 1 - j, z = i;
		break;
	case 3:
		x = j, y = n - 1 - len, z = i;
		break;
	case 4:
		x = n - 1 - i, y = j, z = len;
		break;
	case 5:
		x = i, y = j, z = n - 1 - len;
		break;
	}
}
int main() {
	while (scanf("%d", &n) == 1 && n) {
		rep(i, n) rep(k, 6) rep(j, n) view[k][i][j] = read();
		rep(i, n) rep(j, n) rep(k, n) pos[i][j][k] = '#';
		rep(k, 6) rep(i, n) rep(j, n)
			if (view[k][i][j] == '.')
				rep(p, n) {
				int x, y, z;
				get(k, i, j, p, x, y, z);
				pos[x][y][z] = '.';
			}
		while (true) {
			bool done = true;
			rep(k, 6) rep(i, n) rep(j, n)
				if (view[k][i][j] != '.') {
					rep(p, n) {
						int x, y, z;
						get(k, i, j, p, x, y, z);
						if (pos[x][y][z] == '.') continue;
						if (pos[x][y][z] == '#') {
							pos[x][y][z] = view[k][i][j];
							break;
						}
						if (pos[x][y][z] == view[k][i][j]) break;
						pos[x][y][z] = '.';
						done = false;
					}
				}
			if (done) break;
		}
		int ans = 0;
		rep(i, n) rep(j, n) rep(k, n)
			if (pos[i][j][k] != '.') ans++;
		printf("Maximum weight: %d gram(s)\n", ans);
	}
	return 0;
}
posted @ 2023-09-10 14:01  群星之路  阅读(17)  评论(0)    收藏  举报