求重叠区域

在练习代码能力的时候遇见这样一个题目:

平面内有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);


    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值