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 ...