矩形重叠

Posted Kiven#5197

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩形重叠相关的知识,希望对你有一定的参考价值。

题目:

平面内有n个矩形, 第i个矩形的左下角坐标为, 右上角坐标为。 
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。 
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。

输入描述:

输入包括五行。 
第一行包括一个整数n, 表示矩形的个数。 
第二行包括n个整数,表示左下角的横坐标。 
第三行包括n个整数,表示左下角的纵坐标。 
第四行包括n个整数,表示右上角的横坐标。 
第五行包括n个整数,表示右上角的纵坐标。

输出描述:

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

样例:

in:
2
0 90
0 90
100 200
100 200

out:
2

 

将n个矩形轮流作为被覆盖区域,每次被覆盖则更新区域,n次后求出最大值即可。

 

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node{
 5     int x1,y1,x2,y2;
 6     bool operator < (const node&node1) const{
 7         if(x1!=node1.x1){
 8             return x1<node1.x1;
 9         }
10         if(y1!=node1.y1){
11             return y1<node1.y1;
12         }
13         if(x2!=node1.x2){
14             return x2<node1.x2;
15         }
16         else{
17             return y2<node1.y2;
18         }
19     }
20 }a[60];
21 
22 int main(){
23     int n;
24     cin>>n;
25     for(int i=0;i<n;i++){
26         cin>>a[i].x1;
27     }
28     for(int i=0;i<n;i++){
29         cin>>a[i].y1;
30     }
31     for(int i=0;i<n;i++){
32         cin>>a[i].x2;
33     }
34     for(int i=0;i<n;i++){
35         cin>>a[i].y2;
36     }
37     sort(a,a+n);
38     int ans=0;
39     for(int i=0;i<n;i++){
40         int cnt=0,x1=a[i].x1,y1=a[i].y1,x2=a[i].x2,y2=a[i].y2;
41         for(int j=0;j<n;j++){
42             if(a[j].x1<x2&&a[j].y1<y2&&a[j].x2>x1&&a[j].y2>y1){
43                 x1=max(x1,a[j].x1);
44                 y1=max(y1,a[j].y1);
45                 x2=min(x2,a[j].x2);
46                 y2=min(y2,a[j].y2);
47                 cnt++;
48             }
49         } 
50         ans=max(cnt,ans);
51     }
52     cout<<ans<<endl;
53     return 0;
54 }

 

以上是关于矩形重叠的主要内容,如果未能解决你的问题,请参考以下文章

片段与另一个片段重叠

如何修复重叠的片段

导航上的片段生命周期重叠

查找两个矩形的重叠区域(在 C# 中)

leetcode 矩形重叠 简单

矩形重叠判断