题目;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 }