码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5218 The E-pang Palace (简单几何—2014广州现场赛)

时间:2015-08-13 12:18:06      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:hdu   区域赛   几何   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128


题面:

The E-pang Palace

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 1646    Accepted Submission(s): 1226


Problem Description
E-pang Palace was built in Qin dynasty by Emperor Qin Shihuang in Xianyang, Shanxi Province. It was the largest palace ever built by human. It was so large and so magnificent that after many years of construction, it still was not completed. Building the great wall, E-pang Palace and Qin Shihuang‘s tomb cost so much labor and human lives that people rose to fight against Qin Shihuang‘s regime.

Xiang Yu and Liu Bang were two rebel leaders at that time. Liu Bang captured Xianyang -- the capital of Qin. Xiang Yu was very angry about this, and he commanded his army to march to Xianyang. Xiang Yu was the bravest and the strongest warrior at that time, and his army was much more than Liu Bang‘s. So Liu Bang was frighten and retreated from Xianyang, leaving all treasures in the grand E-pang Palace untouched. When Xiang Yu took Xianyang, he burned E-pang Palce. The fire lasted for more than three months, renouncing the end of Qin dynasty.

Several years later, Liu Bang defeated Xiangyu and became the first emperor of Han dynasty. He went back to E-pang Palace but saw only some pillars left. Zhang Liang and Xiao He were Liu Bang‘s two most important ministers, so Liu Bang wanted to give them some awards. Liu Bang told them: "You guys can make two rectangular fences in E-pang Palace, then the land inside the fences will belongs to you. But the corners of the rectangles must be the pillars left on the ground, and two fences can‘t cross or touch each other."

To simplify the problem, E-pang Palace can be consider as a plane, and pillars can be considered as points on the plane. The fences you make are rectangles, and you MUST make two rectangles. Please note that the rectangles you make must be parallel to the coordinate axes.

The figures below shows 3 situations which are not qualified(Thick dots stands for pillars):

技术分享

Zhang Liang and Xiao He wanted the total area of their land in E-pang Palace to be maximum. Please bring your computer and go back to Han dynasty to help them so that you may change the history.
 

Input
There are no more than 15 test case.

For each test case:

The first line is an integer N, meaning that there are N pillars left in E-pang Palace(4 <=N <= 30).

Then N lines follow. Each line contains two integers x and y (0 <= x,y <= 200), indicating a pillar‘s coordinate. No two pillars has the same coordinate.

The input ends by N = 0.
 

Output
For each test case, print the maximum total area of land Zhang Liang and Xiao He could get. If it was impossible for them to build two qualified fences, print "imp".
 

Sample Input
8 0 0 1 0 0 1 1 1 0 2 1 2 0 3 1 3 8 0 0 2 0 0 2 2 2 1 2 3 2 1 3 3 3 0
 

Sample Output
2 imp
题目大意:
    给定一些点,要以这些点为四个顶点构造矩形,求构造两个矩形不相交(相交关系见图示),且面积最大。不可能则输出imp。

解题:

    比较暴力就好,有点类似上周BC的一道题的做法,直接枚举两个对角线点,然后看另外两个点是否存在,存在的话,继续和另一个矩形判断相对位置关系。但是要小心一个矩形包含在另外一个矩形中,也是可以的,面积只算大的那个。详细看代码。


代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std; 
struct point
{
	int x,y;
}store[35];
bool map[210][210];
int max(int a,int b)
{
	return a>b?a:b;
}
int min(int a,int b)
{
	return a<b?a:b;
}
int judge(int a,int b,int c,int d)
{
   int res;
   //以下分别为两个矩形左下和右上位置坐标
   int lx1,lx2,ly1,ly2,rx1,rx2,ry1,ry2;
   lx1=min(store[a].x,store[b].x);
   ly1=min(store[a].y,store[b].y);
   lx2=min(store[c].x,store[d].x);
   ly2=min(store[c].y,store[d].y);
   rx1=max(store[a].x,store[b].x);
   ry1=max(store[a].y,store[b].y);
   rx2=max(store[c].x,store[d].x);
   ry2=max(store[c].y,store[d].y);
   //是同一个矩形
   if(lx1==lx2&&ly1==ly2&&rx1==rx2&&ry1==ry2)
	   return 0;
   //一个完全在另外一个上面或者右边,那么就是两个矩形加
   if((ry1<ly2)||(ry2<ly1)||(lx1>rx2)||(lx2>rx1))
   {
	       res=(rx1-lx1)*(ry1-ly1)+(rx2-lx2)*(ry2-ly2);
	  return res;
   }
   //如果一个完全包含在另外一个里面
   if(lx2<lx1&&ly2<ly1&&rx1<rx2&&ry1<ry2)
   {
	   res=(rx2-lx2)*(ry2-ly2);
	   return res;
   }
   //如果一个完全包含在另外一个里面
   if(lx1<lx2&&ly1<ly2&&rx2<rx1&&ry2<ry1)
   {
	   res=(rx1-lx1)*(ry1-ly1);
	   return res;
   }
   //否则即为相交
   else
	   return 0;
}
int main()
{
	int n,a,b,c,d,e,f,g,h;
	int area;
	while(scanf("%d",&n)&&n)
	{
	  area=0;
	  memset(map,0,sizeof(map));
	  //读入
      for(int i=0;i<n;i++)
	  {
		  scanf("%d%d",&store[i].x,&store[i].y);
		  //将地图上相应的点标记为有
		  map[store[i].x][store[i].y]=1;
	  }
	  //没8个点,就肯定不行
	  if(n<8)
	  {
		  printf("imp\n");
		  continue;
	  }
	  else
	  {
		  for(int i=0;i<n-1;i++)
		  {
			  for(int j=i+1;j<n;j++)
			  {
				  //因为枚举的是对角线,所以在一条边上就跳过
				  if((store[i].x==store[j].x)||(store[i].y==store[j].y))
					  continue;
				  else
				  {
                     a=store[i].x;
					 b=store[i].y;
					 c=store[j].x;
					 d=store[j].y;
					 //如果除了对角线之外,另外两点存在
					 if(map[c][b]&&map[a][d])
					 {
						 for(int k=0;k<n-1;k++)
						 {
							 //不与原来两点重复
							 if((k!=i)&&(k!=j))
							 {
                                for(int m=k+1;m<n;m++)
								{
									//不与原来两点重复
                                  if((m!=i)&&(m!=j))
								  {
									  //只枚举对角线
									 if((store[k].x==store[m].x)||(store[k].y==store[m].y))
					                   continue;
									 else
									 {
                                        e=store[k].x;
										f=store[k].y;
										g=store[m].x;
										h=store[m].y;
										 //如果除了对角线之外,另外两点存在,这时才判断两个矩形关系
										if(map[g][f]&&map[e][h])
										{
											area=max(area,judge(i,j,k,m));
										}
									 }
								  }
								}
							 }
						 }
					 }
					 else
						 continue;
				  }
			  }
		  }
		  if(area==0)
			  printf("imp\n");
		  else
		  printf("%d\n",area);
	  }
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5218 The E-pang Palace (简单几何—2014广州现场赛)

标签:hdu   区域赛   几何   

原文地址:http://blog.csdn.net/david_jett/article/details/47607015

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!