hdu - 5128 The E-pang Palace(枚举+计算几何)
http://acm.hdu.edu.cn/showproblem.php?pid=5128
给出n个点,求n个点组成两个矩形的最大面积.
矩形必须平行x轴,并且不能相交,但是小矩形在大矩形内部是可以的,面积就为大矩形的面积.
我是枚举一条对角线,然后去找另外两个点是否在坐标中存在这样就可以确定一个矩形,
同理可以枚举出另外有一个矩形,但是要注意坐标不能重复,
判断矩形相交的话,只要判断一个矩形的4个点是否有在另一个矩形的范围内即可.
#include<cstdio>
#include<cstring>
#include<set>
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
int x,y;
bool operator < (const point a) const
{
return x==a.x?y<a.y:x<a.x;
}
}p[],q1,q2,q3,q4; int check(point a,point b,point c) //注意区分是在矩形内部还是在矩形边上
{
if(a.x>=b.x&&a.x<=c.x&&a.y>=c.y&&a.y<=b.y)
{
if(a.x>b.x&&a.x<c.x&&a.y>c.y&&a.y<b.y) return ;
return ;
}
return -;
}
int main()
{
//freopen("a.txt","r",stdin);
int n,area;
while(~scanf("%d",&n)&&n)
{
if(n<) {printf("imp\n");continue;}
set<point>s;
// set<point>::iterator it;
int maxn=,cnt=;
for(int i=;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
s.insert(p[i]);
}
sort(p+,p+n+);
/*for(it=s.begin();it!=s.end();it++)
{
point t=*it;
printf("%d %d\n",t.x,t.y);
}*/
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
if(p[i].x<p[j].x&&p[i].y<p[j].y) //枚举出第一个矩形
{
q1.x=p[i].x;q1.y=p[j].y;
if(!s.count(q1))continue;
q2.x=p[j].x;q2.y=p[i].y;
if(!s.count(q2))continue;
for(int l=;l<=n;l++)
{
for(int k=l+;k<=n;k++)
{
if(p[l].x<p[k].x&&p[l].y<p[k].y)//第二个矩形
{
q3.x=p[l].x;q3.y=p[k].y;
if(!s.count(q3))continue;
q4.x=p[k].x;q4.y=p[l].y;
if(!s.count(q4))continue;
if(i==l||j==l||i==k||j==k)continue; //防止坐标重复
if(q3.x==p[i].x&&q3.y==p[i].y||q3.x==p[j].x&&q3.x==p[j].y) continue;
if(q4.x==p[i].x&&q4.y==p[i].y||q4.x==p[j].x&&q4.x==p[j].y) continue; int x1=check(p[i],q3,q4);
int x2=check(p[j],q3,q4);
int x3=check(q1,q3,q4);
int x4=check(q2,q3,q4); //判断在矩形内部还是边界
if(x1==&&x2==&&x3==&&x4==) //内含
{
// printf("%d %d %d %d\n",q1.x,q1.y,q2.x,q2.y);
area=abs(q4.x-q3.x)*abs(q3.y-q4.y);
if(area>maxn) maxn=area;
//printf("%d\n",area);
cnt=;
}
else if(x1==||x2==||x3==||x4==)continue; //相交
else if(x1==-&&x2==-&&x3==-&&x4==-) //枚举 另一种情况
{
//printf("%d\n",1);
int y1=check(p[l],q1,q2);
int y2=check(p[k],q1,q2);
int y3=check(q3,q1,q2);
int y4=check(q4,q1,q2);
//printf("%d\n",ans);
// printf("%d %d %d %d\n",q1.x,q1.y,q2.x,q2.y);
// printf("%d %d %d %d\n",q3.x,q3.y,q4.x,q4.y);
if(y1==||y2==||y3==||y4==) continue;
else if(y1==&&y2==&&y3==&&y4==)
{
area=abs(q2.x-q1.x)*abs(q1.y-q2.y);
if(area>maxn) maxn=area;
cnt=;
}
else if(y1==-&&y2==-&&y3==-&&y4==-)
{
// printf("%d %d %d %d\n",q1.x,q1.y,q2.x,q2.y);
//printf("%d %d %d %d\n",q3.x,q3.y,q4.x,q4.y);
area=abs(q2.x-q1.x)*abs(q1.y-q2.y)+abs(q4.x-q3.x)*abs(q3.y-q4.y);
// printf("%d\n",area);
if(area>maxn) maxn=area;
cnt=;
}
}
}
}
}
}
}
}
if(!cnt) printf("imp\n");
else
printf("%d\n",maxn);
}
return ;
}
hdu - 5128 The E-pang Palace(枚举+计算几何)的更多相关文章
- HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...
- hdu 5128 The E-pang Palace
http://acm.hdu.edu.cn/showproblem.php?pid=5128 题意:给定N个点,选出其中8个点组成两个矩形,使得两个矩形的面积和最大. 思路:找出所有的矩形,然后枚举, ...
- hdu 1882 Strange Billboard(位运算+枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当 ...
- hdu 2105:The Center of Gravity(计算几何,求三角形重心)
The Center of Gravity Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 5128.The E-pang Palace-计算几何
The E-pang Palace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Othe ...
- HDU 1281——棋盘游戏——————【最大匹配、枚举删点、邻接表方式】
棋盘游戏 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- Hdu 5371 Hotaru's problem (manacher+枚举)
题目链接: Hdu 5371 Hotaru's problem 题目描述: 给出一个字符串N,要求找出一条N的最长连续子串.这个子串要满足:1:可以平均分成三段,2:第一段和第三段相等,3:第一段和第 ...
- Hdu 5358 First One (尺取法+枚举)
题目链接: Hdu 5358 First One 题目描述: 数组a有n个元素,S[i,j]定义为a[i]+a[i+1]+.....+a[j],问:这个死东西等于多少? 解题思路: 二分肯定超,这个题 ...
- HDU 4930 Fighting the Landlords(暴力枚举+模拟)
HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...
随机推荐
- 初识Vivado
Vivado 设计套件包括高度集成的设计环境和新一代从系统到 IC 级的工具,这些均建立在共享的可扩展数据模型和通用调试环境基础上.这也是一个基于 AMBA AXI4 互联规范.IP-XACT IP ...
- 浅析HashSet add() 方法存储自定义类型对象的过程
一.自定义一个Student类 package date0504; public class Student { private String id; Student(String id){ this ...
- Linux-RedHat7.2 安装nginx托管.net core2.0
1.安装依赖包 yum -y install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel 2.下载安装包 wge ...
- error C2143: 语法错误 : 缺少“;”(在“&”的前面)
报错: error C2143: 语法错误 : 缺少“;”(在“&”的前面) 代码: #include <iostream> ostream & << (ost ...
- CPP-基础:关于私有成员的访问
a.C++的类的成员函数中,允许直接访问该类的对象的私有成员变量. b.在类的成员函数中可以访问同类型实例的私有变量. c.拷贝构造函数里,可以直接访问另外一个同类对象(引用)的私有成员. d.类的成 ...
- HTML基础(四)表格
定义和用法 <table> 标签定义 HTML 表格. 简单的 HTML 表格由 table 元素以及一个或多个 tr.th 或 td 元素组成. tr 元素定义表格行,th 元素定义表头 ...
- C字符串指针遇到的问题
看下面的示例代码: int main() { char *ptr = "GeeksQuiz"; printf("%c\n", *&*&*ptr) ...
- OpenJudge-百练-2755
这道题用递归写的话还是很好写的,我们设递归函数的名称为Ways(w,k) . 它的含义就是,w的大小,取k个物品,有多少种方式. 我们可以知道递归的边界条件就是当w的大小为0的时候,我们的方法数只有一 ...
- Hibernate的持久化对象配置
定义Pojo对象和**.hbm.xml文件 -1 对于每一个需要持久化的对象都需要创建一个Pojo类定义,Hibernate要求POJO类定义中必须有一个no-argument的构造方法,便于Hibe ...
- java(List或Array数组)求交集、并集、差集, 泛型工具类
业务需要求不同类型的交集.并集.差集为避免代码冗余编写工具类. 注:list 转数组需传入数组,如果将原数组传入将会改变原数组的值,同时泛型数组又不可以实例化,解决方案:Arrays.copyOf(n ...