題解 P1283 平板塗色

2021-10-21 11:53:13 字數 1926 閱讀 2084

ce 數碼公司開發了一種名為自動塗色機(apm)的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。

為了塗色,apm 需要使用一組刷子。每個刷子塗一種不同的顏色 c

ic_i

ci​ 。apm 拿起一把有顏色 c

ic_i

ci​ 的刷子,並給所有顏色為 c

ic_i

ci​ 且符合下面限制的矩形塗色:

為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊靠它上方的矩形塗色後,才能塗色。例如圖中矩形 f

ff 必須在 c

cc 和 d

dd 塗色後才能塗色。注意,每乙個矩形必須立刻塗滿,不能只塗一部分。

寫乙個程式求乙個使 apm 拿起刷子次數最少的塗色方案。注意,如果一把刷子被拿起超過一次,則每一次都必須記入總數中。

第一行為矩形的個數 n

nn。下面有 n

nn 行描述了 n

nn 個矩形。每個矩形有 5

55 個整數描述,左上角的 y

yy 座標和 x

xx 座標,右下角的 y

yy 座標和 x

xx 座標,以及預定顏色。

平板的左上角座標總是 (0,

0)(0,0)

(0,0)。

乙個整數,表示拿起刷子的最少次數。

7

0 0 2 2 1

0 2 1 6 2

2 0 4 2 1

1 2 4 4 2

1 4 3 6 1

4 0 6 4 1

3 4 6 6 2

3
1≤c

i≤201\le c_i \le 20

1≤ci​≤

20,0 ≤x

i,yi

≤990 \le x_i,y_i \le 99

0≤xi​,

yi​≤

99,1 ≤n

≤161\le n \le 16

1≤n≤16

。這題資料範圍很小,可以直接搜尋。

搜尋每乙個矩形有沒有被塗過,如果沒有塗過,

先判斷這個矩形能不能塗,用 che

ckcheck

chec

k 函式來判斷,**內的注釋已經給得非常詳細了。

如果能塗的話,再看是不是和刷子顏色一樣,如果不是,就++。

#include

using

namespace std;

int n, ans, x1[20]

, _y1[20]

, x2[20]

, y2[20]

, color[20]

;//y1是關鍵字,必須在前面加乙個下劃線

bool visit[20]

;void

search

(int

,int

,int);

bool

check

(int);

intmain()

search(0

,0,-

1); cout << ans << endl;

return0;

}void

search

(int tot,

int finish,

int col)

else

visit[i]

=false

;//回溯}}

bool

check

(int k)

P1283 平板塗色

ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...

P1283 平板塗色

p1283 平板塗色 dfs 記憶化搜尋 將矩陣轉化為圖求解,然後我們發現這是個dag,於是就可以愉快地跑搜尋了。進行dfs時,我們可以用類似拓撲排序的方法。每次將上面所有矩形都被刷過 入度in i 0 的滿足條件的矩形用h陣列打個標記 用incol陣列表示目前h陣列中有幾種顏色,然後列舉可轉移狀態...

洛谷P1283 平板塗色(dfs)

ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...