题意
依我看,这道题最难的地方反而在题目本身,实在不好懂。
大意呢,是说在四维空间下,一个产品由若干个4D cube组成,已知每一个cube和其他的cube的相邻情况,要求判断这个相邻表是否有效,有效的话,再算出这个情况下,需要一个多大的盒子来装下这个产品。
分析
我们可以将这个题简化到三维空间下来思考,以第一个cube为原点,再要遍历一下所有cube的坐标,找到每个坐标轴上正方向最大值和负方向最小值。相乘一下便是体积。
四维空间也是一样道理,我们用一个数组maxlength[8]来记录四个轴八个方向的坐标值。
int& find(int val, int& k)函数用来查找编号为val的cube下标。
bool check(int* pos, int& count, int index)检查下标为index的cube的相邻情况,数组pos记录它所在的位置。
代码如下:
Memory: 248K Time: 0MS Length: 68LINES
#include<iostream>
using namespace std;
int maxlength[8];
int num_cubes;
bool* visited;
int* cubes;
int& find(int val, int& k)
{
while (k < num_cubes)
{
if (val == cubes[k * 9]) break;
++k;
}
return k;
}
bool check(int* pos, int& count, int index)
{
visited[index] = false;
++count;
for (int i = 1; i < 9; ++i)
{
int k = 0;
if (cubes[index * 9 + i] != 0 && visited[find(cubes[index * 9 + i], k)])
{
if (i % 2 && pos[(i + 1) / 2 - 1] - 1 < maxlength[i - 1])
maxlength[i - 1] -= 1;
else if (i % 2 == 0 && pos[(i + 1) / 2 - 1] + 1 > maxlength[i - 1])
maxlength[i - 1] += 1;
int j = i % 2 ? i + 1 : i - 1; //分表代表正负方向
if (cubes[k * 9 + j] == cubes[index * 9])
{
int newpos[4];
newpos[0] = pos[0]; newpos[1] = pos[1]; newpos[2] = pos[2]; newpos[3] = pos[3];
newpos[(i + 1) / 2 - 1] = i % 2 ? newpos[(i + 1) / 2 - 1] - 1 : newpos[(i + 1) / 2 - 1] + 1;//下一个cube的位置
if (!check(newpos, count, k)) return false;
}
else return false;
}
}
return true;
}
int main()
{
int cases;
cin >> cases;
while (cases--)
{
cin >> num_cubes;
cubes = new int[num_cubes * 9];
for (int i = 0; i < num_cubes; ++i)
for (int j = 0; j < 9; ++j) cin >> cubes[i * 9 + j];
visited = new bool[num_cubes];
memset(maxlength, 0, sizeof(int) * 8);
int pos[4];
memset(pos, 0, sizeof(int) * 4);
int count = 0;
if (!check(pos, count, 0) || count != num_cubes) cout << "Inconsistent" << endl;
else
{
int mul = 1;
for (int i = 0; i < 8; i += 2) mul *= (maxlength[i + 1] - maxlength[i] + 1);
cout << mul << endl;
}
delete[] cubes;
delete[] visited;
}
return 0;
}