題目描述
原題來自:poj 1691
ce 數碼公司開發了一種名為自動塗色機(apm)的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。
為了塗色,apm 需要使用一組刷子。每個刷子蘸了顏色 c 。apm 拿起一把蘸有顏色 c 的刷子,並給所有顏色為 c 的矩形塗色。請注意,塗色有順序要求:為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊靠它上方的矩形塗色後,才能塗色。例如圖中矩形 f 必須在 c 和 ddd 塗色後才能塗色。注意,每乙個矩形必須立刻塗滿,不能只塗一部分。
寫乙個程式求乙個使 apm 拿起刷子次數最少的塗色方案。注意,如果一把刷子被拿起超過一次,則每一次都必須記入總數中。
輸入格式
第一行為矩形的個數 n 。
下面有 n 行描述了 n 個矩形。每個矩形有 555 個整數描述,左上角的 y 座標和 x 座標,右下角的 y 座標和 x 座標,以及預定顏色。
輸出格式
一行乙個整數,表示拿起刷子的最少次數。
樣例樣例輸入
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≤n≤14,顏色號為 1 到 20 的整數。保證平板的左上角座標總是 (0,0),座標的範圍是 0到 9 。
我只想吐槽ce公司這個名字不太吉利
這道題比較水,乙個簡單的dfs就能過,只不過加一點貪心的思想
為了盡量少的拿起刷子,我們在一種顏色可以塗的情況下,一定要盡量多的塗
下面給出**:
#include#include#include
#include
#include
#include
#include
using
namespace
std;
inline
intrd()
inline
void write(int
x)struct nodes[100000
];bool cmp(const node &x,const node &y)
intn,m;
int color[1000],book[1000][1000],used[1000
];int ans=99999
;bool check(int x)
void dfs(int step,int sum,int la)
for(int i=1;i<=m;i++)
else
if(used[j]!=0&&s[j].co==i) used[j]++;
}if(cnt>0) dfs(step+1,sum+cnt,i);//
for(int j=n;j>=1;j--)
else
if(used[j]>1&&s[j].co==i) used[j]--;}}
}return;}
intmain()
for(i=1;i<=20;i++) if(color[i]) m=i;
sort(s+1,s+n+1,cmp);//
按照需要塗色順序排列
for(i=2;i<=n;i++)
for(j=i-1;j>=1;j--)
if(s[i].sx==s[j].ex+1&&((s[i].sy>=s[j].sy&&s[i].sy<=s[j].ey)||(s[i].ey>=s[j].sy&&s[i].ey<=s[j].ey)))//
記錄對於排序後的第i個塗色區域有那幾個先行條件
book[i][j]=1
; dfs(
0,0,0
); write(ans);
return0;
}
poj 1691 dfs 矩形塗色
題意 有乙個矩形框由n個小的矩形組成,現在要把每個矩形塗上一種給定的顏色c 可相同可不同,如下圖 塗每個小矩陣有乙個條件,就是位於它上面,並且與它連線的小矩形必須先塗好。當然滿足條件的同一種顏色可以一起塗,問最少需要多少把刷子 每把刷子一種顏色,如果刷子拿起來多次,那麼這些都要加上 原題上有圖 思路...
P1283 平板塗色
ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...
深搜剪枝 平板塗色
ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...