p1283 平板塗色
dfs 記憶化搜尋
將矩陣轉化為圖求解,然後我們發現這是個dag,於是就可以愉快地跑搜尋了。
進行dfs時,我們可以用類似拓撲排序的方法。每次將上面所有矩形都被刷過(入度in[ i ]==0)的滿足條件的矩形用h陣列打個標記
用incol陣列表示目前h陣列中有幾種顏色,然後列舉可轉移狀態進行dfs
發現資料n<16,於是我們可以將狀態用二進位制存起來(0/1表示是否已被刷)進行記憶化搜尋。
#include#include#include
using
namespace
std;
inline
int _max(int &a,int &b)
inline
int _min(int &a,int &b)
struct matra[18
];bool d[18][18],h[18
];int n,ans=1e9,color,in[18],col[18],incol[22],rec[65538
]; //rec:存狀態,用作記憶化
inline
void dfs(int t,int x,int
zip) //所有矩形已刷過
int tmp1[18],tmp2[22],t***[18
],cnt,p;
for(int i=1;i<=n;++i) tmp1[i]=h[i],t***[i]=in
[i];
for(int i=1;i<=color;++i) tmp2[i]=incol[i]; //用tmp陣列儲存當前狀態
for(int i=1;i<=color;++i)}}
dfs(t+1,x+cnt,p);
for(int j=1;j<=n;++j) h[j]=tmp1[j],in[j]=t***[j];
for(int j=1;j<=color;++j) incol[j]=tmp2[j]; //當前狀態回溯
}}int
main()
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i!=j&&a[i].y2==a[j].y1&&a[i].x1a[j].x1)
d[i][j]=1,++in
[j]; //建圖
for(int i=1;i<=n;++i) if(!in[i]) h[i]=1,++incol[col[i]];
dfs(
0,0,0
); printf("%d
",ans);
return0;
}
P1283 平板塗色
ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...
題解 P1283 平板塗色
ce 數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm 需要使用一組刷子。每個刷子塗一種不同的顏色 c ic i ci apm 拿起一把有顏色 c ic i ci 的刷子,並給所有顏色為 c ic i ci 且符合下面...
洛谷P1283 平板塗色(dfs)
ce數碼公司開發了一種名為自動塗色機 apm 的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。為了塗色,apm需要使用一組刷子。每個刷子塗一種不同的顏色c。apm拿起一把有顏色c的刷子,並給所有顏色為c且符合下面限制的矩形塗色 為了避免顏料滲漏使顏色混合,乙個矩形只能在所有緊...