在练习代码能力的时候遇见这样一个题目:
平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。 如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。 请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
点计数法,重叠后的矩形左下角坐标一定是{x1[0]~x1[50], y1[0]~y1[50]}这2500个点中产生,
暂时想到一个比较笨的办法:两两比较做左下标,选出坐标中的值比较大的横纵坐标,即两个矩形离原点最近的交点
然后在以此为范围,依次遍历全部的模块,如果这个点在这个模块内,则这个模块与这两个模块有重叠
下面是代码:
import java.util.Scanner;
public class Num {
static int[][] arr;
static int res=1;
static int n;
public static void main(String[] args){
Scanner in=new Scanner(System.in);
n=in.nextInt();
/*if(n>=50||n<=2){
return;
}*/
arr = new int[4][n];
for(int i=0;i<4;i++){
for(int j=0;j<n;j++){
arr[i][j]=in.nextInt();
}
}
//思路:点计数法,重叠后的矩形左下角坐标一定是{x1[0]~x1[50], y1[0]~y1[50]}这2500个点中产生,
// 只要分别判断这些点在多少矩形中即可
solve();
}
/*
*
* 第I个点的左下角横x坐标,第2个点的左下角横坐标
*
* 第I个点的左下角纵y坐标,第2个点的左下角纵坐标
*
* 第I个点的左下角横x坐标,第2个点的左下角纵坐标
*
* 第I个点的左下角纵y坐标,第2个点的左下角纵坐标
*
* */
public static void solve(){
int x,y,count;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
x=Math.max(arr[0][i],arr[0][j]);//比较两个砖块的左下角的横坐标
y=Math.max(arr[1][i],arr[1][j]);//比较两个砖块的左下角的纵坐标
count=0;
for(int k=0;k<n;k++){
if(x >= arr[0][k] && y >= arr[1][k] && x < arr[2][k] && y < arr[3][k])
++count;
}//然后看跟那些快有交集计算count
res=res>count?res:count;
}
}
System.out.println(res);
}
}