noip2002矩陣覆蓋(搜尋)

2022-04-06 04:55:42 字數 1576 閱讀 8484

矩陣覆蓋

在平面上有 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 面積和為 4。問題是當 n 個點座標和 k 給出後,怎樣才能使得覆蓋所有點的 k 個矩形的面積之和為最小呢。約定:覆蓋乙個點的矩形面積為 0;覆蓋平行於座標軸直線上點的矩形面積也為0。各個矩形必須完全分開(邊線與頂點也都不能重合)。

輸入格式:

n k xl y1 x2 y2 ... ...

xn yn (0<=xi,yi<=500)

輸出格式:

輸出至螢幕。格式為:

乙個整數,即滿足條件的最小的矩形面積之和。

輸入樣例#1:

4 2

1 12 2

3 60 7

輸出樣例#1:

4

/*

初始時,所有矩形的左下點座標(+∞,+∞),右上角座標(-∞,-∞)

然後按輸入順序,乙個點乙個點挨個搜

判斷被搜的那個點是否被所有矩形覆蓋了,如果有矩形沒有覆蓋這個點,

該矩形以最優解形式覆蓋這個點(即這個點在矩形的邊上),

每搜乙個點後,就判斷當前狀態下,所有矩形是否沒有覆蓋,把不合法的廢枝丟掉,提高效率

*/#include

#include

#define maxn 100

#define inf 0x3f3f3f3f

int ans=inf,n,k;

struct

point

dots[maxn];

struct

square

sqr[100

];

int checkit(int i,int j) //

檢查第i、j個矩形之間是否有衝突(即兩個矩形有重疊區域)

int check() //

檢查當前所有已知矩形是否都合法。合法返回1

return

1;

} int getsqr() //

函式獲取當前所有矩形覆蓋面積之和

return

ans;

} void srch(int now) //

尋找第now個點時矩形是否能覆蓋

inti,j;

for(i=0;i//

從第0個矩形迴圈搜尋到第k-1個矩形,判斷矩形是否覆蓋了點now

} intmain()

srch(

0);

printf("%d

",ans);

return

0;

}

心若向陽,無謂悲傷

noip2002 矩形覆蓋

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

NOIP 2002 矩形覆蓋

題目描述 在平面上有 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 覆蓋,...

noip 2002 矩形覆蓋

在平面上有 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...