洛谷P1283 平板塗色(dfs)

2021-08-07 16:07:36 字數 2093 閱讀 9203

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。

輸出至檔案paint.out,檔案中記錄拿起刷子的最少次數。

輸入樣例#1:

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

輸出樣例#1:

蒟蒻看到這題,先是mengbi,表示不會dp,只能搜尋(+剪枝)

這資料竟然過了(n<16)

讀入資料,統計顏色,然後每個顏色都試一遍,即把該顏色的且能塗的磚塗上。

下一次塗色不能塗上次塗過的色。塗完了記錄結果

你這不會超時嗎老鐵

為了不超時,加了兩個剪枝

至於判斷該磚是否能塗,先預處理,把緊鄰該磚上方的磚用陣列記錄下來,再判斷那些磚是否被塗

**如下(格式醜勿噴)

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct lbq //結構體 a1b1 該磚左上角座標 a2b2 右下角座標 x 顏色

a[20];

int ccmp(lbq a,lbq b)

;//de陣列表示是否有該顏色

int n,m,ans=999,b[20],fk[20][20]; //b陣列代表該磚是否被塗

bool ok(int o)

void dfs(int o,int pq,int xx) //o 塗色次數 pq 塗過顏色的磚 xx 上次塗的顏色

for(int i=1;i<=m;i++) //列舉顏色

else

if(b[j]&&a[j].x==i) b[j]++;

}if(qq>0) dfs(o+1,pq+qq,i); 如果塗了磚,進行下一步

for(int j=n;j>=1;j--) //回溯一步

else

if(b[j]>1&&a[j].x==i) b[j]--; }}

}}int main()

for(int i=1;i<=20;i++) if(de[i]) m=i; //求最大顏色編號

sort(a+1,a+n+1,ccmp); //按左上角座標大小從小到大排序(先考慮縱,再考慮橫)

for(int i=2;i<=n;i++)

for(int j=i-1;j>=1;j--) //fk[i][j]表示第i個磚是否緊鄰上方第j個磚

if(a[i].a1==a[j].a2+1&&((a[i].b1>=a[j].b1&&a[i].b1<=a[j].b2)||(a[i].b2>=a[j].b1&&a[i].b2<=a[j].b2)))

fk[i][j]=1; //如果i磚的最上面緊鄰j磚最下面,且兩磚橫座標有重疊,即j磚為i磚緊鄰上面的磚

dfs(0,0,0);

cout

/結果return

0;}

提問:從這個故事中你懂得了什麼?【滑稽】洛谷題解(名為diamond_sword)

P1283 平板塗色

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

P1283 平板塗色

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

題解 P1283 平板塗色

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