hdu - 5128 The E-pang Palace(枚举+计算几何)
2015-08-11 10:15
232 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5128
给出n个点,求n个点组成两个矩形的最大面积.
矩形必须平行x轴,并且不能相交,但是小矩形在大矩形内部是可以的,面积就为大矩形的面积.
我是枚举一条对角线,然后去找另外两个点是否在坐标中存在这样就可以确定一个矩形,
同理可以枚举出另外有一个矩形,但是要注意坐标不能重复,
判断矩形相交的话,只要判断一个矩形的4个点是否有在另一个矩形的范围内即可.
给出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[35],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 1; return 0; } return -1; } int main() { //freopen("a.txt","r",stdin); int n,area; while(~scanf("%d",&n)&&n) { if(n<8) {printf("imp\n");continue;} set<point>s; // set<point>::iterator it; int maxn=0,cnt=0; for(int i=1;i<=n;i++) { scanf("%d%d",&p[i].x,&p[i].y); s.insert(p[i]); } sort(p+1,p+n+1); /*for(it=s.begin();it!=s.end();it++) { point t=*it; printf("%d %d\n",t.x,t.y); }*/ for(int i=1;i<=n;i++) { for(int j=i+1;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=1;l<=n;l++) { for(int k=l+1;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==1&&x2==1&&x3==1&&x4==1) //内含 { // 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=1; } else if(x1==0||x2==0||x3==0||x4==0)continue; //相交 else if(x1==-1&&x2==-1&&x3==-1&&x4==-1) //枚举 另一种情况 { //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==0||y2==0||y3==0||y4==0) continue; else if(y1==1&&y2==1&&y3==1&&y4==1) { area=abs(q2.x-q1.x)*abs(q1.y-q2.y); if(area>maxn) maxn=area; cnt=1; } else if(y1==-1&&y2==-1&&y3==-1&&y4==-1) { // 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=1; } } } } } } } } if(!cnt) printf("imp\n"); else printf("%d\n",maxn); } return 0; }
相关文章推荐
- 浅谈微信三级分销系统的漏洞
- JQuery发送ajax请求不能用数组作为参数
- uva11388(水题)
- ZooKeeper客户端地址列表的随机原理
- mdadm彻底删除software RAID
- 【Java设计模式】· 解释器模式(Interpreter Pattern)
- poj 2109 Power of Cryptography
- PHP面向对象(OOP):__call()处理调用错误
- 100+Android 开源项目分类汇总二(精品 )
- hdu 2647(拓扑排序)
- PHP实现获取某个月份周次信息的方法
- 畅通工程
- Masonry介绍与使用实践
- zookeeper安装部署
- 闲谈集群管理模式
- leetcode 题解代码整理 16-20题
- TCP协议与UDP协议的区别
- 常用border\background\font的缩写详解
- 22. 程序员生存定律-公司选择上的方法论
- Binary Tree Level Order Traversal