最大矩形面积

26 篇文章 0 订阅
17 篇文章 0 订阅

Problem Description

在一个矩形区域内有很多点,每个点的坐标都是整数。求一个矩形,使之内部没有点,且面积最大。所求矩形的边与坐标轴平行。

Input

一个整数t,表示测试组数。
整数l,w表示矩形横向边长和竖向边长。
 一个整数n,表示该矩形内点的个数。
 n个点的坐标x,y。

Output

最大面积。

Sample Input

2
2 3
0
10 10
4
1 1
9 1
1 9
9 9 

Sample Output

6
80

Hint

 

Source

代码:

import java.util.Scanner;
class Point{
    int l;
    int r;
    public Point(int l,int r)
    {
        this.l = l;
        this.r = r;
    }
}
public class Main {
    public static Point p[] = new Point[10000];
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int lmax,rmax;
        int T = reader.nextInt();
        while(T-->0)
        {
            int l = reader.nextInt();///chang
            int w = reader.nextInt();///kuan
            int n = reader.nextInt();
            
            for(int i=0;i<n;i++)
            {
                int x = reader.nextInt();
                int y = reader.nextInt();
                p[i] = new Point(x,y);
            }
            p[n] = new Point(0,0);///新加的点
            p[n+1] = new Point(l,w);
            lmax = getl(n,w);
            rmax = getr(n,l);
            System.out.println(Math.max(lmax,rmax));
        }
        reader.close();
    }
    public static int getl(int n,int w)
    {
        /*
         * 根据横坐标的大小排序。
         */
        Point t = new Point(0,0);
        for(int i=0;i<n+2;i++)///多加了两个点
        {
            for(int j=i+1;j<n+2;j++)
            {
                if(p[i].l>p[j].l)
                {
                    t = p[i];
                    p[i] = p[j];
                    p[j] = t;
                }
                else if(p[i].l==p[j].l&&p[i].r>p[j].r)
                {
                    t = p[i];
                    p[i] = p[j];
                    p[j] = t;
                }
            }
        }
        int sum = 0;
        int up = 0;
        int down = 0;
        for(int i=0;i<n+2;i++)
        {
            up = w;
            down = 0;///初始化。
            for(int j=i+1;j<n+2;j++)
            {
                if(p[i].l!=p[j].l)//不在一条竖直线上。
                {
                    sum = Math.max(sum,(p[j].l-p[i].l)*(up-down));//更新数据,取最大值
                    if(p[j].r>p[i].r)///处于上方,更新上边界。
                    {
                        up = Math.min(up,p[j].r);
                    }
                    else down = Math.max(down,p[j].r);//更新下边界
                }
            }
        }
        return sum;
    }
    public static int getr(int n,int l)///这里和上面一样,不再作具体的解释。
    {
        /*
         * 按照纵坐标的顺序排序
         */
        Point t = new Point(0,0);
        for(int i=0;i<n+2;i++)
        {
            for(int j=i+1;j<n+2;j++)
            {
                if(p[i].r>p[j].r)
                {
                    t = p[i];
                    p[i] = p[j];
                    p[j] = t;
                }
                else if(p[i].r==p[j].r&&p[i].l>p[j].l)
                {
                    t = p[i];
                    p[i] = p[j];
                    p[j] = t;
                }
            }
        }
        int sum = 0;
        int up = 0;
        int down = 0;
        for(int i=0;i<n+2;i++)
        {
            up = l;
            down = 0;
            for(int j=i+1;j<n+2;j++)
            {
                if(p[i].r!=p[j].r)
                {
                    sum = Math.max(sum,(p[j].r-p[i].r)*(up-down));
                    if(p[j].l>p[i].l)
                    {
                        up = Math.min(up,p[j].l);
                    }
                    else down = Math.max(down,p[j].l);
                }
            }
        }
        return sum;
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值