P1034 矩形覆蓋(dfs,剪枝)

2021-09-26 08:25:13 字數 1521 閱讀 7727

p1034 矩形覆蓋

不想寫題意描述了,看鏈結吧。。。

由於資料範圍較小(k

<5,

n<

50k<5,n<50

k<5,

n<50

)所以考慮直接搜尋,通過搜尋來確定每個點是否能放進乙個矩形中,狀態記錄當前點被矩形覆蓋後的總面積.

#include

#define inf 0x3f3f3f3f

using

namespace std;

struct nodenode[55]

;struct squaresqr[6]

;int n,k,ans,tot,maxn=inf;

bool

check

(int now,

int sq)

//矩形賦初值

if(node[now]

.x .x1 ) sqr[sq]

.x1 =node[now]

.x ;

if(node[now]

.y .y1 ) sqr[sq]

.y1 =node[now]

.y ;

if(node[now]

.x >sqr[sq]

.x3 ) sqr[sq]

.x3 =node[now]

.x ;

if(node[now]

.y >sqr[sq]

.y3 ) sqr[sq]

.y3 =node[now]

.y ;

//已有初值,矩形大小改變

for(

int i=

1;i<=k;i++

)return

true

;//沒有以上情況,可以放入該矩形

}void

dfs(

int now)

if(now>n||tot>=maxn)

return

;//函式遞迴的三種情況:已超出n,還沒到n矩形面積和就比當前最小面積和大了,或者是已經放不進任何乙個矩形了

for(

int i=

1;i<=k;i++

) sqr[i]

.x1 =a,sqr[i]

.y1 =b,sqr[i]

.x3 =c,sqr[i]

.y3 =d;

//記得開臨時數存先前狀態

}return;}

intmain()

dfs(1)

;printf

("%d\n"

,maxn)

;return0;

}

又一次沒有認真看題。。。題目說的「邊線與頂點也都不能重合」被你吃了嗎!?

zyb說的果然對,這種小資料範圍的題就考慮爆搜,注意特判和剪枝.

u pd

at

eupdate

update

好像原先做法不是正解?正解發一波.

P1034 矩形覆蓋

在平面上有nn個點 n le 50n 50 每個點用一對整數座標表示。例如 當 n 4n 4 時,44個點的座標分另為 p 1p1 1,11,1 p 2p2 2,22,2 p 3p3 3,63,6 p 4p4 0,70,7 見圖一。這些點可以用kk個矩形 1 le k le 41 k 4 全部覆蓋,...

P1034 矩形覆蓋

在平面上有 n 個點 n 50 每個點用一對整數座標表示。例如 當 n 4 時,4個點的座標分另為 p1 1,1 p2 2,2 p3 3,6 p4 0,7 見圖一。這些點可以用 k 個矩形 1 k 4 全部覆蓋,矩形的邊平行於座標軸。當 k 2 時,可用如圖二的兩個矩形 sl,s2 覆蓋,s1,s2...

洛谷 P1034 矩形覆蓋(dfs)

有n個點k個矩陣,k個矩陣包含n個點,求這k個矩陣的最小面積 因為資料範圍很小,所以可以直接暴搜,求每個點可以存在矩陣的位置,利用幾次剪枝 因為資料太水,不剪也行 即可通過 include using namespace std define ll long long const int maxn ...