hdu 5128 The E-pang Palace
http://acm.hdu.edu.cn/showproblem.php?pid=5128
题意:给定N个点,选出其中8个点组成两个矩形,使得两个矩形的面积和最大。
思路:找出所有的矩形,然后枚举,挑选求中的两个矩形,判断位置关系,符合条件求出他们的和最大值。坑点:可以内含,内含的时候计算外面的矩形的面积。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }