思路:
开一个 64*64*64 大小的数组,记录该位置是否有放置方块。
开一个 25000 大小的数组,记录每个方块的位置。
然后每放一个方块,首先看该位置能不能放,然后再看6个方向是否有其他方块,如果有的话,就要调整总面积的和。
#include <stdio.h>
char placed[64][64][64];
struct node {
int x, y, z;
} box[25032];
int main()
{
int i, j, x, y, z, sum, N;
char str[16];
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d", &N);
box[1].x = 32;
box[1].y = 32;
box[1].z = 0;
placed[32][32][0] = 1;
sum = 5;
for (i = 2; i <= N; i++) {
scanf("%d%s", &j, str);
x = box[j].x;
y = box[j].y;
z = box[j].z;
switch (str[0]) {
case 'L': x--; break;
case 'R': x++; break;
case 'F': y--; break;
case 'B': y++; break;
case 'O': z++; break;
case 'U': z--; break;
}
if (z < 0)
break;
if (placed[x][y][z])
break;
box[i].x = x;
box[i].y = y;
box[i].z = z;
placed[x][y][z] = 1;
sum += 6;
if (placed[x - 1][y][z])
sum -= 2;
if (placed[x + 1][y][z])
sum -= 2;
if (placed[x][y - 1][z])
sum -= 2;
if (placed[x][y + 1][z])
sum -= 2;
if (!z)
sum--;
else if (placed[x][y][z - 1])
sum -= 2;
if (placed[x][y][z + 1])
sum -= 2;
}
printf("%d\n", i <= N ? -1 : sum);
return 0;
}