实话说这个题就是个暴力,但是有坑,第一次我以为相含是不行的,结果WA,我加上相含以后还WA,我居然把这两个矩形的面积加在一块了吗,应该取大的那一个啊……
方法就是枚举对角线,为了让自己不蒙圈,我写了一个矩阵类,可以实现自动判断是否能成功形成矩阵,自动排序四个点,返回面积,方便以后的判断。
C++面向对象大法好……
代码及注释如下:
#include<bits/stdc++.h> using namespace std; #define MaxN 55 #define MaxM 222 struct Pos{ int x,y; void Set(int x1,int y1) { x = x1; y = y1; } }p[MaxN]; int isp[MaxM][MaxM],n; bool cmp(Pos a,Pos b){ if(a.x != b.x) return a.x < b.x; return a.y < b.y; } class Rec{ public: Pos k[4]; int area; bool Creat(Pos a,Pos b){ k[0].x = a.x,k[0].y = a.y; k[1].x = b.x,k[1].y = b.y; k[2].x = a.x,k[2].y = b.y; k[3].x = b.x,k[3].y = a.y; sort(k,k+4,cmp);///排序便于判断 area = abs(a.x-b.x)*abs(a.y-b.y); for(int i = 0;i < 4;i++){ int tx = k[i].x,ty = k[i].y; if(isp[tx][ty]==0) { return false; } } return true; } }; bool Equal(Pos a,Pos b){ return (a.x==b.x && a.y==b.y); } bool All_in(Pos a,Pos b,Pos c){ return (c.x>a.x && c.x<b.x && c.y>a.y && c.y<b.y); } bool Part_in(Pos a,Pos b,Pos c){ return (c.x>=a.x && c.x<=b.x && c.y>=a.y && c.y<=b.y); } int Check(Rec a,Rec b){ for(int i = 0;i < 4;i++){///判断重复点 if(Equal(a.k[i],b.k[i])) return 0; } int tot1 = 0,tot2 = 0; for(int i = 0;i < 4;i++){///先判断是否两个相含 if(All_in(a.k[0],a.k[3],b.k[i])) tot1++; if(All_in(b.k[0],b.k[3],a.k[i])) tot2++; } if(tot1 == 4 || tot2 == 4) { return 2; } for(int i = 0;i < 4;i++){///不是相含,就必须相离 if(Part_in(a.k[0],a.k[3],b.k[i])) return 0; if(Part_in(b.k[0],b.k[3],a.k[i])) return 0; } return 1; } int Get_ans(){ int ans = -1; Rec a,b; for(int i = 0;i < n;i++)///枚举对角线 { for(int j = i+1;j < n;j++) { if(p[i].x==p[j].x || p[i].y==p[j].y) continue; if(a.Creat(p[i],p[j]) == false) continue; for(int k = 0;k < n;k++) { for(int q = k+1;q < n;q++) { if(p[k].x==p[q].x || p[k].y==p[q].y) continue; if(b.Creat(p[k],p[q]) == false) continue; int c = Check(a,b); if(c == 1) ans = max(ans,a.area+b.area); if(c == 2) ans = max(ans,max(a.area,b.area)); ///相含的话,选择较大的面积 } } } } return ans; } int main() { // freopen("B.in.cpp","r",stdin); int x,y; while(cin>>n && n) { memset(isp,0,sizeof(isp)); for(int i = 0; i < n; i++) { cin>>x>>y; p[i].Set(x,y); isp[x][y] = 1; } int ans = Get_ans(); if(ans == -1) cout<<"imp"<<endl; else cout<<ans<<endl; } return 0; }