n個矩形的重疊面積問題及其變種 python實現

2021-09-12 07:31:52 字數 2367 閱讀 6729

問題:平面上有n個平行於座標軸的矩形,他們總的覆蓋面積是多少?重疊的面積只算一次

最佳參考:

這裡最重要的要理解的一點是:mp[i][j]的含義,這裡0<= i# 下面的函式為求解函式,array為矩形的座標矩陣,單個矩形表示為[x0,y0,x1,y1],n為矩形的個數

deffunc

(array, n)

: list_x =

list_x.extend(

[x[0

]for x in array]

) list_x.extend(

[x[2

]for x in array]

) list_x =

sorted

(list

(set

(list_x)))

list_y =

list_y.extend(

[x[1

]for x in array]

) list_y.extend(

[x[3

]for x in array]

) list_y =

sorted

(list

(set

(list_y)))

numx, numy=

len(list_x)

,len

(list_y)

mp =[[

0for i in

range

(numy-1)

]for j in

range

(numx-1)

]for i in

range

(n):

l_x, r_x = list_x.index(array[i][0

]), list_x.index(array[i][2

])l_y, r_y = list_y.index(array[i][1

]), list_y.index(array[i][3

])for m in

range

(l_x,r_x)

:for n in

range

(l_y,r_y)

: mp[m]

[n]+=

1 area =

0for i in

range

(numx-1)

:for j in

range

(numy-1)

:if mp[i]

[j]:

area +=

(list_x[i+1]

-list_x[i])*

(list_y[i+1]

-list_y[i]

)return area

# 這是一道筆試題,下面為輸入部分

n=int

(input()

)array =

for i in

range

(n):

str_in =

input()

nums =

[int

(n)for n in str_in.split()]

# [x0,y0,x1,y1]

print

(func(array,n)

)變種一:求被所有矩形都覆蓋的面積大小,上面**中判斷條件 if mp[i][j]: 改為 if mp[i][j]==n: 即可

變種二:計算出平面內重疊矩形數量最多的地方,有多少個矩形相互重疊。 這個返回mp矩陣中最大的哪個數就可以了,當然要注意,如果最大數是1,說明沒有矩形重疊,這種情況另外做輸出。

def

commonarea

(rec1,rec2)

: l_x =

max(rec1[0]

,rec2[0]

) d_y =

max(rec1[1]

,rec2[1]

) r_x =

min(rec1[2]

,rec2[2]

) u_y =

min(rec1[3]

,rec2[3]

) length = r_x-l_x

wide = u_y-d_y

if length>

0and wide>0:

return length*wide

return

0#rec = [x0,y0,x1,y1]

rec1=[1

,1,4

,4]rec2=[2

,2,5

,5]print

(commonarea(rec1,rec2)

)

求包括n個矩形的最小矩形面積模板

typedef double typev const double eps 1e 8 const int n 50005 int sign double d struct point point operator point d ps n int n,cn double dist point d1,...

計算2個矩形所佔的面積

這是在leetcode上看到的題目。2個矩形由各自的左下角和右上角來定義。座標定義為 a,b c,d e,f g,h 頂點座標全部為int整數。兩個矩形分布可以分為三種情況。分離,包含與相交。如下 public class rearea else if a e c g b f d h else if...

計算兩個多邊形的重疊面積

include include include using namespace std const int maxn 300 const double eps 1e 6 位置標識 int dcmp double x struct point double cross point a,point b,...