[二分][dfs]JZOJ 2748 最大立方体空间 80%做法

35 篇文章 0 订阅
13 篇文章 0 订阅

Description

给出一个长方体的箱子,还有在箱子里面的N个长方体的盒子,箱子和盒子的各个边都是平行于某个三维坐标轴。现在要求你找出其中最大的立方体空间,输出它的长度。
首先这个空间必须位于箱子里面,而且不能与其它的盒子占的空间冲突。这个空间也必须是各边平行于某个坐标轴。如下图所示。
这里写图片描述

题解

二分枚举到可能的立方体长度
然后用dfs判断是否成立
在dfs中枚举每个盒子,如果与n个盒子都没有交集,继续往下搜
如果有交集,向三个地方变化位置,这样就可以那80

代码

#include<cstdio>
#include<memory.h>
#include<iostream>
using namespace std;
int n,l,w,h;
bool flag;
struct edge{int x1,y1,z1,x2,y2,z2;}k[2000];
void search(int x,int y,int z,int dep,int s)
{
    if (flag) return;
    int xx=x+s,yy=y+s,zz=z+s;
    if (xx>l||yy>w||zz>h) return;
    if (dep>n) 
    {
        flag=1;
        return;
    }
    if (xx<=k[dep].x1||yy<=k[dep].y1||zz<=k[dep].z1||x>=k[dep].x2||y>=k[dep].y2||z>=k[dep].z2)
    {
        search(x,y,z,dep+1,s);
        return;
    }
    search(k[dep].x2,y,z,1,s);
    search(x,k[dep].y2,z,1,s);
    search(x,y,k[dep].z2,1,s);
}
bool check(int x)
{
    flag=0;
    search(0,0,0,1,x);
    if (flag) return 1;else return 0;
}
int ef(int l,int r)
{
    int x=-1,mid;
    while (l<=r)
    {
        mid=(l+r)>>1;
        if (check(mid))
        {
            x=mid;
            l=mid+1;    
        }
        else r=mid-1;
    }
    return x;
}
int main()
{
    int t;
    scanf("%d",&t);
    for (int z=1;z<=t;z++)
    {
        scanf("%d%d%d%d",&n,&l,&w,&h);
        for (int i=1;i<=n;i++) scanf("%d%d%d%d%d%d",&k[i].x1,&k[i].y1,&k[i].z1,&k[i].x2,&k[i].y2,&k[i].z2);
        int ans=ef(0,min(l,min(w,h)));
        cout<<"Case "<<z<<": "<<ans<<endl;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值