hdu5128The E-pang Palace dfs暴力

来源:互联网 发布:网络大电影众筹平台 编辑:程序博客网 时间:2024/06/18 13:06
//给n个点坐标 , 找出两个矩形//这两个矩形不相交且不接触 , 问两个矩形围的最大面积//n很小 , 直接暴力即可 , 只是需要注意一个矩形包含在//另一个矩形中时其面积是大的那个矩形的面积#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std ;const int maxn = 40  ;int x[maxn] , y[maxn] ;struct node{    int x , y ;    bool operator < (struct node tmp) const    {        if(x == tmp.x)        return y < tmp.y ;        return x < tmp.x ;    }}a[maxn] ;int vis[maxn] ;int n ;bool judge(int i){   if(x[0+i] != x[1+i] || x[2+i] != x[3+i]  || y[0 + i] != y[2 + i] || y[1+i] != y[i+3])   return false ;   return true ;}int get_ans(){    if(!judge(4))return 0 ;    int minx = max(x[0] , x[4]) ;    int miny = max(y[0] , y[4]) ;    int maxx = min(x[3] , x[7]) ;    int maxy = min(y[3] , y[7]) ;    if(minx > maxx || miny > maxy)    return ((y[3] - y[0])*(x[3] - x[0]) + (y[7] - y[4])*(x[7] - x[4])) ;    if(x[4] > x[0] && y[4] > y[0] && x[7] < x[3] && y[7] < y[3])    return (y[3] - y[0])*(x[3] - x[0]) ;    if(x[0] > x[4] && y[0] > y[4] && x[3] < x[7] && y[3] < y[7])    return  (y[7] - y[4])*(x[7] - x[4]) ;    return 0  ;}int dfs(int pos , int len , int sum){    if(sum == 2)    return get_ans() ;    if(len == 4)    {        if(!judge(0))        return 0 ;        return dfs(0 , 0 , sum+1) ;    }    int ans = 0 ;    for(int i = pos + 1 ;i <= n;i++)    {        if(vis[i])continue ;        x[len+sum*4] = a[i].x ;        y[len+sum*4] = a[i].y ;        vis[i] = 1 ;        ans = max(ans , dfs(i , len + 1 , sum)) ;        vis[i] = 0 ;    }    return ans ;}int main(){   // freopen("in.txt" , "r" , stdin) ;    //freopen("out.txt" , "w" , stdout) ;    while(scanf("%d", &n) && n)    {        for(int i = 1;i <= n;i++)        scanf("%d%d" , &a[i].x , &a[i].y) ;        sort(a+1 , a+1+n) ;        memset(vis , 0 , sizeof(vis)) ;        int ans = dfs(0 , 0 , 0) ;        if(!ans)        puts("imp") ;        else        printf("%d\n" , ans) ;    }    return 0 ;}
0 0
原创粉丝点击