平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
平面内有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。
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; }
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个矩形为基准最多重叠个数
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