1. 程式人生 > >矩形重疊(矩形相交,dp)

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

log cstring stream 計算 右上角 truct struct else AI

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

#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; //矩形右上角縱坐標
};
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;
        }
        //最長遞增子序列的模版
        int 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]=1;   //遞增的長度
            for(int j=1; j<i; j++)
            {
                if(fan(nodes[i],nodes[j])&&dp[i]<dp[j]+1)
                {
                    k=1;
                    dp[i]=dp[j]+1;
                    pre[i]=j;
                }
            }
            if(dp[i]>maxs)
            {
                maxs=dp[i];
            }
        }
        if(k==0)
        cout<<"1";
        else
        cout<<maxs<<endl;
    }
    return 0;
}

  

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