UVALive 7070 The E-pang Palace(暴力)

时间:2023-03-09 15:34:00
UVALive 7070 The E-pang Palace(暴力)

  实话说这个题就是个暴力,但是有坑,第一次我以为相含是不行的,结果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[];
int area;
bool Creat(Pos a,Pos b){
k[].x = a.x,k[].y = a.y;
k[].x = b.x,k[].y = b.y;
k[].x = a.x,k[].y = b.y;
k[].x = b.x,k[].y = a.y;
sort(k,k+,cmp);///排序便于判断
area = abs(a.x-b.x)*abs(a.y-b.y);
for(int i = ;i < ;i++){
int tx = k[i].x,ty = k[i].y;
if(isp[tx][ty]==) {
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 = ;i < ;i++){///判断重复点
if(Equal(a.k[i],b.k[i])) return ;
}
int tot1 = ,tot2 = ;
for(int i = ;i < ;i++){///先判断是否两个相含
if(All_in(a.k[],a.k[],b.k[i])) tot1++;
if(All_in(b.k[],b.k[],a.k[i])) tot2++;
}
if(tot1 == || tot2 == ) {
return ;
}
for(int i = ;i < ;i++){///不是相含,就必须相离
if(Part_in(a.k[],a.k[],b.k[i])) return ;
if(Part_in(b.k[],b.k[],a.k[i])) return ;
}
return ;
}
int Get_ans(){
int ans = -;
Rec a,b;
for(int i = ;i < n;i++)///枚举对角线
{
for(int j = i+;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 = ;k < n;k++)
{
for(int q = k+;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 == ) ans = max(ans,a.area+b.area);
if(c == ) 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,,sizeof(isp));
for(int i = ; i < n; i++)
{
cin>>x>>y;
p[i].Set(x,y);
isp[x][y] = ;
}
int ans = Get_ans();
if(ans == -) cout<<"imp"<<endl;
else cout<<ans<<endl;
}
return ;
}