hdu 5128 暴力枚举

题目:

题目分析:暴力枚举水题。。。枚举出长方形,再枚举出各种搭配即可

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 37

using namespace std;

int n;

struct point 
{
    int x,y;
    bool operator < ( const point& a ) const
    {
        if ( x == a.x ) return y < a.y;
        else return x < a.x;
    }
}p[MAX];

struct rectangle
{
    point p1,p2;
    int area;
}r[MAX*MAX];


int mp[217][217];

int pattern ( int i , int j )
{
    if ( r[i].p2.x < r[j].p1.x ) return 1;
    if ( r[i].p2.y < r[j].p1.y ) return 1;
    if ( r[i].p1.x > r[j].p2.x ) return 1;
    if ( r[i].p1.y > r[j].p2.y ) return 1;
    if ( r[i].p1.x < r[j].p1.x && r[i].p1.y < r[j].p1.y
        &&r[i].p2.x > r[j].p2.x && r[i].p2.y > r[j].p2.y ) return 2;
    else return 0;
}

int main ( )
{
    while ( scanf ( "%d" , &n ) , n )
    {
        memset ( mp , 0 , sizeof ( mp ) );
        for ( int i = 0 ; i < n ; i++ )
        {
           scanf ( "%d%d" , &p[i].x , &p[i].y );
           mp[p[i].x][p[i].y] = 1;
        }
        sort ( p , p + n );
        int cnt = 0;
        for ( int i = 0 ; i < n ; i++ )
            for ( int j = i+1 ; j < n ; j++ )
                if ( p[j].x > p[i].x && p[j].y > p[i].y )
                    if ( mp[p[i].x][p[j].y] && mp[p[j].x][p[i].y] )
                    r[cnt].p1.x = p[i].x , r[cnt].p1.y = p[i].y,
                    r[cnt].p2.x = p[j].x , r[cnt].p2.y = p[j].y,
                    r[cnt++].area = ( p[j].x - p[i].x ) * ( p[j].y - p[i].y );
        int ans = -1;
        for ( int i = 0 ; i < cnt ; i++ )
            for ( int j = 0 ; j < cnt ; j++ )
            {
                if ( pattern(i,j)  == 1 ) 
                    ans = max ( ans , r[i].area + r[j].area );
                else if ( pattern(i,j) == 2 ) 
                    ans = max ( ans , r[i].area );
            }
        if ( ans == -1 ) puts ( "imp" );
        else printf ( "%d\n" , ans );
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值