矩形重叠(矩形相交,dp)

平面有n个矩形,第一个矩形左下标为(x1[1],y1[1]),右上标为(x2[1],y2[1]).

如果有2个或多个矩形有公共区域则认为他们相互重叠

计算平面内重叠矩形数量最多的地方有几个矩形相互重叠

输入

第一行n(2<=n<=50),表示矩形的个数

第二行n个整数x1[i] (-10^9<=x1[i]<=10^9),表示左下角的横坐标

第三行 n个整数y1[i] (-10^9<=y1[i]<=10^9),表示左下角的纵坐标

第四行n个整数x2[i] (-10^9<=x1[i]<=10^9),表示右上角的横坐标

第五行 n个整数y2[i] (-10^9<=y1[i]<=10^9),表示右上角的纵坐标

输出

输出一个正整数, 表示最多的地方有几个矩形相互重叠,如果都不重叠输出1;

测试数据:
2

0 90 

0 90

100 200

100 200

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;

struct node
{
    double x1; //矩形左下角横坐标
    double y1; //矩形左下角纵坐标
    double x2; //矩形右上角横坐标
    double y2; //矩形右上角纵坐标
    int t;
};
node c;

int fan(node a,node b) //判断a,b两个矩形是否相交,矩形c是相交矩阵
{
    double xc1,xc2,yc1,yc2;
    xc1=max(a.x1,b.x1);
    xc2=min(a.x2,b.x2);
    yc1=max(a.y1,b.y1);
    yc2=min(a.y2,b.y2);
    if(xc1<xc2&&yc1<yc2)
    {
        c.x1=xc1;
        c.y1=yc1;
        c.x2=xc2;
        c.y2=yc2;
        return 1;
    }
    else
        return 0;
}

int main()
{
    int n;
    int x1[55];
    int y1[55];
    int x2[55];
    int y2[55];
    node nodes[55];
    while(cin>>n)
    {
        for(int i=1; i<=n; i++)
        {
            cin>>nodes[i].x1;

        }
        for(int i=1; i<=n; i++)
        {
            cin>>nodes[i].y1;
        }
        for(int i=1; i<=n; i++)
        {
            cin>>nodes[i].x2;
        }
        for(int i=1; i<=n; i++)
        {
            cin>>nodes[i].y2;
        }
//最长递增子序列的模版
        node dp[55];
        int pre[55];
//memset(dp,0,sizeof(dp));
        memset(pre,0,sizeof(pre));
        int maxs=1;
        int k=0;
        for(int i=1; i<=n; i++)
        {
            pre[i]=i; //开始的地方
            dp[i].x1=nodes[i].x1;
            dp[i].y1=nodes[i].y1;
            dp[i].x2=nodes[i].x2;
            dp[i].y2=nodes[i].y2;
            dp[i].t=1; //递增的长度
            for(int j=1; j<i; j++)
            {
                if(fan(dp[i],nodes[j])&&dp[i].t<dp[j].t+1)
                {
                    k=1;
                    dp[i].x1=c.x1;
                    dp[i].y1=c.y1;
                    dp[i].x2=c.x2;
                    dp[i].y2=c.y2;
                    dp[i].t=dp[j].t+1;
                    pre[i]=j;
                }
            }
            if(dp[i].t>maxs)
            {
                maxs=dp[i].t;
            }
        }
        if(k==0)
            cout<<"1";
        else
            cout<<maxs<<endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/dshn/p/8663159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
836. 矩形重叠是一道经典的计算几何问题。给定两个矩形的左下角和右上角坐标,我们需要判断这两个矩形是否重叠。 要判断两个矩形是否重叠,我们可以比较它们的位置关系。如果第一个矩形的右上角坐标小于第二个矩形的左下角坐标,或者第一个矩形的左下角坐标大于第二个矩形的右上角坐标,那么这两个矩形是不重叠的。反之,如果两个矩形的左下角和右上角坐标都满足条件,那么它们就是重叠的。 我们可以用以下伪代码来实现这个判断过程: function isRectangleOverlap(rectangle1, rectangle2): if rectangle1.top < rectangle2.bottom or rectangle1.bottom > rectangle2.top: return false if rectangle1.right < rectangle2.left or rectangle1.left > rectangle2.right: return false return true 其中,rectangle1和rectangle2分别代表两个矩形的左下角和右上角坐标。top、bottom、left和right分别代表矩形的上边界、下边界、左边界和右边界。 通过这个算法,我们就可以判断两个矩形是否重叠了。不过需要注意的是,对于矩形重叠的问题,不同人可能有不同的定义。在本算法中,我们采用的是矩形边界不重叠的定义。如果边界重叠也算作矩形重叠的话,只需要将上述判断条件中的小于号和大于号改为小于等于号和大于等于号即可。 总之,矩形重叠问题可以通过比较矩形的坐标来判断。这是一道简单但常见的计算几何问题,我们可以用上述算法快速解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值