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

给你n个点,问能否组成两个不相交的与坐标轴平行的矩形,能就输出两矩形的面积和,不能就输出一个字符串。

由于n的范围就30,所以就是枚举一下就行,先将能够组成的矩形找出来,然后再两两比较,注意的是有一个矩形包含另一个矩形的

情况,此时和就是大矩形的面积。写的时候细心一点就好。

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 struct point{
 8    int x,y;
 9 }a[220];
10 
11 int ju[31500][5],dir1[220][220];
12 
13 int max(int x,int y){return x>y?x:y;}
14 
15 bool cmp(point a,point b)
16 {
17     if (a.x==b.x) return a.y<b.y;
18     return a.x<b.x;
19 }
20 
21 int check(int *x,int *y){
22    if (a[x[0]].x<a[y[0]].x&&a[x[2]].x>a[y[2]].x&&a[x[1]].y>a[y[1]].y&&a[x[0]].y<a[y[0]].y)
23      return 1;
24    return 0;
25 }
26 
27 int main()
28 {
29     int n,i,q,k,u;
30     while (~scanf("%d",&n)&&n)
31     {
32         int ans=0;
33         for (i=1 ; i<=n ; i++) scanf("%d%d",&a[i].x,&a[i].y);
34         sort(a+1,a+n+1,cmp);
35         for (i=1 ; i<=n ; i++){
36             int j=i;
37             while (a[i].x==a[j].x) j++;
38             for (k=i+1 ; k<j ; k++){
39                 for (u=j ; u<=n ; u++){
40                     if (a[u].y==a[i].y){
41                         for (q=u+1 ; q<=n ; q++){
42                             if (a[q].y==a[k].y){
43                                 ju[ans][0]=i;
44                                 ju[ans][1]=k;
45                                 ju[ans][2]=u;
46                                 ju[ans++][3]=q;
47                             }
48                         }
49                     }
50                 }
51             }
52         }
53         /*for (i=0 ; i<ans ; i++) {
54             for (int j=0 ; j<4 ; j++)
55                 cout<<ju[i][j];
56             cout<<endl;
57         }*/
58         int sum=0;
59         if (ans<2) {puts("imp");continue;}
60         for (i=0 ; i<ans ; i++){
61             memset(dir1,0,sizeof(dir1));
62             int ar1=(a[ju[i][2]].x-a[ju[i][0]].x)*(a[ju[i][1]].y-a[ju[i][0]].y);
63             for (k=a[ju[i][0]].x ; k<=a[ju[i][2]].x ; k++){
64                 for (q=a[ju[i][0]].y ; q<=a[ju[i][1]].y ; q++)
65                     dir1[k][q]=1;
66             }
67             for (int j=i+1 ; j<ans ; j++){
68                 int flag=0;
69                 for (k=a[ju[j][0]].x ; k<=a[ju[j][2]].x ; k++){
70                 for (q=a[ju[j][0]].y ; q<=a[ju[j][1]].y ; q++){
71                      if (dir1[k][q]==1) flag=1;
72                 }
73                 }
74                 if (flag==0||check(ju[i],ju[j])||check(ju[j],ju[i])){
75                 int ar2=ar1;
76                 ar2+=(a[ju[j][2]].x-a[ju[j][0]].x)*(a[ju[j][1]].y-a[ju[j][0]].y);
77                 if (check(ju[i],ju[j])) ar2=ar1;
78                 if (check(ju[j],ju[i])) ar2-=ar1;
79                 sum=max(ar2,sum);
80                 }
81             }
82         }
83         if (sum==0) puts("imp");
84         else printf("%d\n",sum);
85     }
86     return 0;
87 }

 

posted on 2016-04-30 20:12  蜘蛛侦探  阅读(305)  评论(0编辑  收藏  举报