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;
}
}