題目:
平面內有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
輸出
2
鏈接:
牛客網:
思路標籤:
- 數學問題
解答:
- 使用暴力求解,遍歷實現;
- 遍歷每個在多少個矩形中出現,只要出現說明該點的矩形就會出現重疊。
- 求出現次數最多的點,返回其次數即爲重疊的個數。
- 暴力美學。
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 50 + 5;
int X1[maxn], Y1[maxn];
int X2[maxn], Y2[maxn];
int a[110], b[110];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> X1[i];
a[i] = X1[i];
}
for (int i = 0; i < n; i++) {
cin >> Y1[i];
b[i] = Y1[i];
}
for (int i = 0; i < n; i++) {
cin >> X2[i];
a[i + n] = X1[i];
}
for (int i = 0; i < n; i++) {
cin >> Y2[i];
b[i + n] = Y1[i];
}
int ans = 0;
for (int x = 0; x<2 * n; x++)
{
for (int y = 0; y<2 * n; y++)
{
int cnt = 0;
for (int i = 0; i < n; i++)
{
if (X1[i] <= a[x] && Y1[i] <= b[y] && X2[i] > a[x] && Y2[i] > b[y]) cnt++;
}
ans = max(ans, cnt);
}
}
cout << ans << endl;
return 0;
}