POJ 1188 Gleaming the Cubes


题意:给定n个正方体,求他们的交体积。

题解:知道两个长方体相交的算法就能很简单的解出这道题,实际上两个长方体交,就是取x1,y1,z1各自的最大值,以及x2,y2,z2各自的最小值就是了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct data
{
    int x1,y1,z1;
    int x2,y2,z2;
    data(){}
    data(int _x,int _y,int _z,int _d)
    {
        x1=_x;y1=_y;z1=_z;
        x2=_x+_d;y2=_y+_d;z2=_z+_d;
    }
    data(int _x1,int _y1,int _z1,int _x2,int _y2,int _z2)
    {
        x1=_x1;y1=_y1;z1=_z1;
        x2=_x2;y2=_y2;z2=_z2;
    }
    bool ok()
    {
        return x1<x2&&y1<y2&&z1<z2;
    }
    int volume()
    {
        if(ok())
            return (x2-x1)*(y2-y1)*(z2-z1);
        else
            return 0;
    }
};
data inter(data a,data b)
{
    if(a.ok())
        return data(max(a.x1,b.x1),max(a.y1,b.y1),max(a.z1,b.z1),min(a.x2,b.x2),min(a.y2,b.y2),min(a.z2,b.z2));
    else
        return data(0,0,0,-1);
}
int main()
{
    int n,x,y,z,d;
    while(scanf("%d",&n),n)
    {
        scanf("%d%d%d%d",&x,&y,&z,&d);
        data ans(x,y,z,d);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d%d%d",&x,&y,&z,&d);
            ans=inter(ans,data(x,y,z,d));
        }
        printf("%d\n",ans.volume());
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值