POJ 1022--Packing Unit 4D Cubes

题意

依我看,这道题最难的地方反而在题目本身,实在不好懂。

大意呢,是说在四维空间下,一个产品由若干个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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值