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

【題目分析】:題目為判斷矩形的重疊個數,通過列舉的方式,可以得到結果複雜度為O(n^3),只要有一個點是包含關係即可。矩形一個點再另一個矩形內就可以滿足重疊。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;
int a1[maxn] , b1[maxn] ;
int a2[maxn] , b2[maxn] ;
set<int> xx, yy;
int main(){
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++){
    scanf("%d", &a1[i]);
    xx.insert(a1[i]);
  }
  for (int i = 0; i < n; i++){
    scanf("%d", &b1[i]);
    yy.insert(b1[i]);
  }
  for (int i = 0; i < n; i++){
    scanf("%d", &a2[i]);
    xx.insert(a2[i]);
  }
  for (int i = 0; i<n; i++){
    scanf("%d", &b2[i]);
    yy.insert(b2[i]);
  }
  int ans = 0;
  for (int x : xx){
    for (int y : yy){
      int cnt = 0;
      for (int i = 0; i<n; i++){
        if (a1[i] <= x && b1[i] <= y && a2[i]>x &&b2[i]>y)cnt++;
      }
      ans = max(ans, cnt);
    }
  }
  printf("%d\n", ans);
  return 0;
}