首页 > 试题广场 >

矩形重叠

[编程题]矩形重叠
  • 热度指数:336 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

平面内有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<algorithm>
#include<vector>
using namespace std;

int main() {
    int n;
    cin>>n;
    vector<int> x1(n),x2(n),y1(n),y2(n);
    for (int i = 0; i < n; ++i)
        cin >> x1[i];
    for (int i = 0; i < n; ++i)
        cin >> y1[i];
    for (int i = 0; i < n; ++i)
        cin >> x2[i];
    for (int i = 0; i < n; ++i)
        cin >> y2[i];
    vector<int> x(x1), y(y1);
    for (int i = 0; i != n; ++i) 
    {
        x.push_back(x2[i]);
        y.push_back(y2[i]);
    }
    int result = 0;
    for (int m = 0; m < 2*n; ++m) 
    {
        for (int k = 0; k < 2 * n; ++k) 
        {
            int count = 0;
            for (int i = 0; i < n; ++i) 
            {
                if (x[m]>x1[i] && y[k] > y1[i] && x[m] <= x2[i] && y[k] <= y2[i])
                    count++;
            }
            result = max(count, result);
        }
    }
    cout << result << endl;
}


编辑于 2018-08-08 21:57:02 回复(0)
def solve(x1,x2,y1,y2,k,xa,ya,xb,yb):
    if k==len(x1):
        return 0
    else:
        if x1[k]>=xb or y1[k]>=yb or xa>=x2[k] or ya>=y2[k]:
            return solve(x1,x2,y1,y2,k+1,xa,ya,xb,yb)
        else:
            xa1=max(xa,x1[k])
            ya1=max(ya,y1[k])
            xb1=min(xb,x2[k])
            yb1=min(yb,y2[k])
            return max(solve(x1,x2,y1,y2,k+1,xa,ya,xb,yb),\
                      solve(x1,x2,y1,y2,k+1,xa1,ya1,xb1,yb1)+1)
if __name__=='__main__':
    import sys
    n=int(input())
    a=[]
    m=4
    while m:
        ss=sys.stdin.readline()
        if ss.strip():
            line=ss.strip().split()
            a.append([int(x) for x in line])
            m-=1
    x1,y1,x2,y2=a[0],a[1],a[2],a[3]
    ans=1
    for i in range(len(x1)):
        num=solve(x1,x2,y1,y2,i,x1[i],y1[i],x2[i],y2[i])
        ans=max(num,ans)
    print(ans)

搜索第i个矩形为基准最多重叠个数
发表于 2018-08-13 21:38:12 回复(0)
import sys

def num(x, y, x1, y1, x2, y2, n):
    r = 0
    for i in range(n):
        if x > x1[i] and x < x2[i] and y > y1[i] and y < y2[i]:
            r += 1
    return r

def X(i, j, x1, y1, x2, y2, n):
    l = [[x1[i], y1[j]],
         [x1[i], y2[j]],
         [x2[i], y1[j]],
         [x2[i], y2[j]],
         [x1[j], y1[i]],
         [x1[j], y2[i]],
         [x2[j], y1[i]],
         [x2[j], y2[i]],
         [x1[i], y1[i]],
         [x1[i], y2[i]],
         [x2[i], y1[i]],
         [x2[i], y2[i]],
         [x1[j], y1[j]],
         [x1[j], y2[j]],
         [x2[j], y1[j]],
         [x2[j], y2[j]]]
    return l

n = int(sys.stdin.readline())
x1 = [int(x) for x in sys.stdin.readline().split()]
y1 = [int(x) for x in sys.stdin.readline().split()]
x2 = [int(x) for x in sys.stdin.readline().split()]
y2 = [int(x) for x in sys.stdin.readline().split()]
r = 0
for i in range(n):
    for j in range(i+1, n):
        for x, y in X(i, j, x1, y1, x2, y2, n):
            r = max(r, num(x+0.1, y+0.1, x1, y1, x2, y2, n))
            r = max(r, num(x-0.1, y+0.1, x1, y1, x2, y2, n))
            r = max(r, num(x+0.1, y-0.1, x1, y1, x2, y2, n))
            r = max(r, num(x-0.1, y-0.1, x1, y1, x2, y2, n))
print r
发表于 2018-08-10 04:12:05 回复(0)