深搜剪枝 平板塗色

2021-10-04 22:45:11 字數 1478 閱讀 3016

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

為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色:

為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊靠它上方的矩形塗色後,才能塗色。例如圖中矩形f必須在c和d塗色後才能塗色。注意,每乙個矩形必須立刻塗滿,不能只塗一部分。

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

【輸入】

第一行為矩形的個數n。下面有n行描述了n個矩形。每個矩形有5個整數描述,左上角的y座標和x座標,右下角的y座標和x座標,以及預定顏色。

顏色號為1到20的整數。

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

座標的範圍是0…99。n小於16。

【輸出】

拿起刷子的最少次數。

【輸入樣例】

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
【搜尋思路】

輸入資料,統計顏色個數,預處理資料,用二維陣列記錄緊鄰上方的塊,用於後面的判斷,然後以顏色為搜尋順序,直到所有塊都填滿,記錄結果。

剪枝一(最優性剪枝):當塗色次數超過當前最優結果,直接退出當前當前搜尋。

剪枝二(可行性剪枝):如果當前分支沒有搜尋到一塊磚,則直接退出當前搜尋。

【**】

#include

#include

using

namespace std;

int maps[20]

[20], minx =

20, maxc, n;

struct rec

}r[20];

bool

cmp(rec a, rec b)

bool

judge

(int p)

void

dfs(

int k,

int p,

int col)

int f[20]

;//記錄搜尋過程,用於回溯

memset

(f,0

,sizeof

(f))

;for

(int i =

1; i <= maxc; i++)if

(num >0)

}}}}

intmain()

深搜的剪枝

深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行if特判剪枝,用好了可以大大的優化複雜度 這裡就根據兩個例題來講吧 詳情見 include include include intn,k int f 210 7 int main printf d n f n k 輸出最大值 return0 詳情見 ...

深搜優化剪枝

之前做過不少深搜題,很多tle,所以剪枝很重要,如何 未雨綢繆 避免不必要的搜尋樹分支?例題 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸出乙個整數,即不同的分法。由題意...

深搜剪枝小結

深度優先搜尋,俗稱深搜,即dfs,是乙個常用並且基礎的演算法和思想。但是搜尋演算法的時間複雜度往往很大,是oi不被允許的。所以對於深搜的優化最實用和基礎的乙個方法就是剪枝。三原則 1 正確性 2 準確性 3 高效性 正確性,顧名思義就是不能把通向正確的路徑剪去。準確性,則是盡可能多的剪去不會通向正確...