博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[二分][dfs]JZOJ 2748 最大立方体空间 80%做法
阅读量:5226 次
发布时间:2019-06-14

本文共 1514 字,大约阅读时间需要 5 分钟。

Description

给出一个长方体的箱子,还有在箱子里面的N个长方体的盒子,箱子和盒子的各个边都是平行于某个三维坐标轴。现在要求你找出其中最大的立方体空间,输出它的长度。

首先这个空间必须位于箱子里面,而且不能与其它的盒子占的空间冲突。这个空间也必须是各边平行于某个坐标轴。如下图所示。
这里写图片描述

题解

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

代码

#include
#include
#include
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 "<
<<": "<
<

转载于:https://www.cnblogs.com/Comfortable/p/8412244.html

你可能感兴趣的文章
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
关于ajax回调数据类型为Json,如何获得他的值
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
Linux下使用pip安装keras
查看>>
OpenCv-Python 图像处理基本操作
查看>>
博物院与国宝
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>