矩阵重叠(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。
示例1
输入
2 0 90 0 90 100 200 100 200
输出
2
分析
1 // 数学 题目为判断矩形的重叠个数,通过枚举的方式,只要有一个点是包含关系即可。矩形的一个点在另一个矩形内即重叠。 2 3 #include <bits/stdc++.h> 4 using namespace std; 5 6 int x[50][2]; 7 int y[50][2]; 8 9 int main() 10 { 11 int n; 12 scanf("%d", &n); 13 for (int i = 0; i < n; i++) 14 scanf("%d", &x[i][0]); 15 for (int i = 0; i < n; i++) 16 scanf("%d", &y[i][0]); 17 for (int i = 0; i < n; i++) 18 scanf("%d", &x[i][1]); 19 for (int i = 0; i < n; i++) 20 scanf("%d", &y[i][1]); 21 int res = 0; 22 for (int j = 0; j < n; j++) 23 { 24 for (int k = 0; k < n; k++) 25 { 26 int temp = 0; 27 for (int i = 0; i < n; i++) 28 // 这里不能同时>= <=要防止边界 题目要求边界不算如 29 // 这样可以避免把一个点刚好是一个个矩形的右上,是另外一个矩形的左下 30 // 这样这个点只会被右上的时候计算一次,然后避免重复计算 31 if (x[j][0] >= x[i][0] && x[j][0] < x[i][1] && y[k][0] >= y[i][0] && y[k][0] < y[i][1]) 32 temp++; 33 res = max(res, temp); 34 } 35 } 36 printf("%d\n", res); 37 return 0; 38 }