2019校招真题编程(六)矩形重叠

题目描述

网易

平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。

如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。

请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。

输入包括五行。
第一行包括一个整数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 <= x2[i] <= 10^9),表示右上角的横坐标。
第五行包括n个整数y2[i](-10^9 <= y2[i] <= 10^9),表示右上角的纵坐标。

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

我的思路

感觉贼笨蛋,将每个矩形所有面积内覆盖,读出矩阵最大数

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    cout<<"enter n: ";
    cin>>n;
    
    vector<int>x1(n, 0);
    vector<int>y1(n, 0);
    vector<int>x2(n, 0);
    vector<int>y2(n, 0);
    
    int maxValue = 0;
    int maxx=0, maxy=0;
    cout<<"enter each index:"<<endl;
    for(int i=0; i<n; i++)
    {
        cin>>x1[i];
        maxx = maxx>x1[i]?maxx:x1[i];
    }
    for(int i=0; i<n; i++)
    {
        cin>>y1[i];
        maxy = maxy>y1[i]?maxy:y1[i];
    }
    for(int i=0; i<n; i++)
    {
        cin>>x2[i];
        maxx = maxx>x2[i]?maxx:x2[i];
    }
    for(int i=0; i<n; i++)
    {
        cin>>y2[i];
        maxy = maxy>y2[i]?maxy:y2[i];
    }
    
    vector<vector<int>> record(maxx+1, vector<int>(maxy+1, 0));
    
    for(int i=0; i<n; i++)
    {
        for(int x=x1[i]; x<=x2[i]; x++)
        {
            for(int y=y1[i]; y<=y2[i]; y++)
            {
                record[x][y] +=1;
                maxValue = maxValue>record[x][y]?maxValue:record[x][y];
            }
        }
    }
    cout<<maxValue<<endl;
}

咩有通过

答案错误:您提交的程序没有通过所有的测试用例
case通过率为40.00%

解题思路

链接:https://www.nowcoder.com/questionTerminal/a22dd98b3d224f2bb89142f8acc2fe57
来源:牛客网

参考:无论何种情况,重叠区域也是四条边组成。而且是取自与n的矩形中的四条。所以遍历边的交点即可。

想要知道某个重合区域在多少个矩形内,可以转化为计算这个重合区域的左下角在多少个矩形内。外面两层循环遍历了所有重合区域可能的左下角,最里层循环计算这个左下角在多少个矩形内。

核心代码

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin>>n;
    
    vector<int>x1(n, 0);
    vector<int>y1(n, 0);
    vector<int>x2(n, 0);
    vector<int>y2(n, 0);
    
    int maxValue = 0, res=0;
    int maxx=0, maxy=0;

    for(int i=0; i<n; i++)
    {
        cin>>x1[i];
    }
    for(int i=0; i<n; i++)
    {
        cin>>y1[i];
    }
    for(int i=0; i<n; i++)
    {
        cin>>x2[i];
    }
    for(int i=0; i<n; i++)
    {
        cin>>y2[i];
    }
    
    for(int x: x1)
    {
        for(int y: y1)
        {
            for(int i=0; i<n; i++)
                if(x>=x1[i] && x<x2[i] && y>=y1[i] && y<y2[i])
                {
                    maxValue++;
                }

            res = res>maxValue?res:maxValue;
            maxValue=0;

        }
    }
    cout<<res<<endl;
    return 0;
    
}

运行时间:5ms

占用内存:408k

发布了68 篇原创文章 · 获赞 2 · 访问量 6163

猜你喜欢

转载自blog.csdn.net/qq_30050175/article/details/104115885