hdu 5128 The E-pang Palace

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

题意:给定N个点,选出其中8个点组成两个矩形,使得两个矩形的面积和最大。

思路:找出所有的矩形,然后枚举,挑选求中的两个矩形,判断位置关系,符合条件求出他们的和最大值。坑点:可以内含,内含的时候计算外面的矩形的面积。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 
  6 int n;
  7 struct node
  8 {
  9     int x,y;
 10     bool operator <(const node &a) const
 11     {
 12         return (x<a.x)||(x==a.x&&y<a.y);
 13     }
 14 } p[50000],q[50000],f1[10],f2[10];
 15 
 16 struct node1
 17 {
 18     int num[10];
 19 } c[100000];
 20 
 21 int main()
 22 {
 23     //freopen("sss.txt","w",stdout);
 24     while(scanf("%d",&n)!=EOF)
 25     {
 26         if(n==0) break;
 27 
 28         for(int i=1; i<=n; i++)
 29         {
 30             scanf("%d %d",&p[i].x,&p[i].y);
 31         }
 32         if(n<8)
 33         {
 34             printf("imp\n");
 35             continue;
 36         }
 37         sort(p+1,p+n+1);
 38         int t1=0;
 39         for(int i=1; i<=n; i++)
 40         {
 41             for(int j=1; j<=n; j++)
 42             {
 43                 if(i==j) continue;
 44                 for(int a=1; a<=n; a++)
 45                 {
 46                     if(i==a||j==a) continue;
 47                     for(int b=1; b<=n; b++)
 48                     {
 49                         if(i==b||j==b||a==b) continue;
 50                         q[0]=p[i];
 51                         q[1]=p[j];
 52                         q[2]=p[a];
 53                         q[3]=p[b];
 54                         sort(q,q+4);
 55                         if(q[0].x!=q[1].x||q[0].y!=q[2].y||q[2].x!=q[3].x||q[3].y!=q[1].y)
 56                         {
 57                             continue;
 58                         }
 59                         if(q[0].x!=q[3].x&&q[0].y!=q[3].y)
 60                         {
 61                             c[t1].num[0]=i;
 62                             c[t1].num[1]=j;
 63                             c[t1].num[2]=a;
 64                             c[t1++].num[3]=b;
 65                         }
 66                     }
 67                 }
 68             }
 69         }
 70         int ans=-1;
 71         for(int i=0; i<t1; i++)
 72         {
 73             f1[0]=p[c[i].num[0]];
 74             f1[1]=p[c[i].num[1]];
 75             f1[2]=p[c[i].num[2]];
 76             f1[3]=p[c[i].num[3]];
 77             sort(f1,f1+4);
 78             for(int j=0; j<t1; j++)
 79             {
 80                 if(i==j) continue;
 81                 f2[0]=p[c[j].num[0]];
 82                 f2[1]=p[c[j].num[1]];
 83                 f2[2]=p[c[j].num[2]];
 84                 f2[3]=p[c[j].num[3]];
 85                 sort(f2,f2+4);
 86                 bool flag=false;
 87                 for(int ii=0; ii<4; ii++)
 88                 {
 89                     for(int jj=0; jj<4; jj++)
 90                     {
 91                         if(p[c[i].num[ii]].x==p[c[j].num[jj]].x&&p[c[i].num[ii]].y==p[c[j].num[jj]].y)
 92                         {
 93                             flag=true;
 94                             break;
 95                         }
 96                     }
 97                     if(flag) break;
 98                 }
 99                 if(flag) continue;
100                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y<=f1[1].y&&f2[1].y>=f1[1].y&&f2[2].x>=f1[2].x)
101                 {
102                      continue;
103                 }
104                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y<=f1[1].y&&f2[1].y>=f1[0].y&&f2[2].x>=f1[2].x)
105                 {
106                      continue;
107                 }
108                 if(f1[0].x>=f2[0].x&&f1[0].x<=f2[2].x&&f1[0].y<=f2[1].y&&f1[1].y>=f2[1].y&&f1[2].x>=f2[2].x)
109                 {
110                     continue;
111                 }
112                 if(f1[0].x>=f2[0].x&&f1[0].x<=f2[2].x&&f1[0].y<=f2[1].y&&f1[1].y>=f2[0].y&&f1[2].x>=f2[2].x)
113                 {
114                     continue;
115                 }
116                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y<=f1[1].y&&f2[1].y>=f1[0].y&&f2[0].y<=f1[0].y)
117                 {
118                     continue;
119                 }
120                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y>=f1[0].y&&f2[0].y<=f1[1].y&&f2[1].y>=f1[1].y)
121                 {
122                     continue;
123                 }
124                 if(f2[0].x<=f1[0].x&&f1[0].x<=f2[2].x&&f1[0].y<=f2[1].y&&f1[1].y>=f2[0].y&&f1[0].y<=f2[0].y)
125                 {
126                     continue;
127                 }
128                 if(f2[0].x<=f1[0].x&&f1[0].x<=f2[2].x&&f1[0].y>=f2[0].y&&f1[0].y<=f2[1].y&&f1[1].y>=f2[1].y)
129                 {
130                     continue;
131                 }
132                 int s=-1;
133                 if(f1[0].x>f2[0].x&&f1[2].x<f2[2].x&&f1[0].y>f2[0].y&&f1[1].y<f2[1].y)
134                 {
135                     s=(f2[1].y-f2[0].y)*(f2[2].x-f2[0].x);
136                 }
137                 else if(f2[0].x>f1[0].x&&f2[2].x<f1[2].x&&f2[0].y>f1[0].y&&f2[1].y<f1[1].y)
138                 {
139                    s=(f1[1].y-f1[0].y)*(f1[2].x-f1[0].x);
140                 }
141                 else
142                 s=(f1[1].y-f1[0].y)*(f1[2].x-f1[0].x)+(f2[1].y-f2[0].y)*(f2[2].x-f2[0].x);
143                 ans=max(ans,s);
144             }
145         }
146         if(ans==-1) printf("imp\n");
147         else
148         printf("%d\n",ans);
149     }
150     return 0;
151 }
View Code

 

posted @ 2015-01-16 19:23  null1019  阅读(248)  评论(0编辑  收藏  举报