1. 程式人生 > >網易2018實習生筆試程式設計題

網易2018實習生筆試程式設計題

平面內有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。

輸入例子1:
2
0 90
0 90
100 200
100 200

輸出例子1:
2

思路:
存下所有的x座標和y座標,然後分別進行排序。然後我們得到了兩個陣列,一個是x座標的陣列,一個是y座標的陣列,分別都有2n個整數,就有2n*2n個點,我們算這每個點被多少個矩形包含就行。
#include <iostream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string>

using namespace std;

class juxing
{
public:
    int lb_x;
    int lb_y;
    int rt_x;
    int rt_y;
    juxing(int a, int b, int c, int d): lb_x(a), lb_y(b), rt_x(c), rt_y(d){}
};

int main()
{
    int n;
    scanf("%d", &n);
    
    vector<int> lbX(n);
    for (int i = 0; i < n; i++)
        scanf("%d", &lbX[i]);
    vector<int> lbY(n);
    for (int i = 0; i < n; i++)
        scanf("%d", &lbY[i]);
    vector<int> rtX(n);
    for (int i = 0; i < n; i++)
        scanf("%d", &rtX[i]);
    vector<int> rtY(n);
    for (int i = 0; i < n; i++)
        scanf("%d", &rtY[i]);
    
    vector<juxing> AllJuXing;
    for (int i = 0; i < n; i++)
        AllJuXing.push_back(juxing(lbX[i], lbY[i], rtX[i], rtY[i]));

    vector<int> XX;
    for (int i = 0; i < n; i++)
    {
        XX.push_back(lbX[i]);
        XX.push_back(rtX[i]);
    }
    vector<int> YY;
    for (int i = 0; i < n; i++)
    {
        YY.push_back(lbY[i]);
        YY.push_back(rtY[i]);
    }
    
    int count = 0, ret = 0;
    for (int i = 0; i < XX.size(); i++)
    {
        for (int j = 0; j < YY.size(); j++)
        {
            for (int k = 0; k < AllJuXing.size(); k++)
            {
                if (XX[i] >= AllJuXing[k].lb_x && XX[i] < AllJuXing[k].rt_x && YY[j] >= AllJuXing[k].lb_y && YY[j] < AllJuXing[k].rt_y)
                    count ++;
            }
            ret = max(ret, count);
            count = 0;
        }
    }
    cout<<ret;
    return 0;
}