平板塗色
阿新 • • 發佈:2018-09-13
include 數碼 ans == map 避免 clu 限制 sin
CE數碼公司開發了一種名為自動塗色機(APM)的產品。它能用預定的顏色給一塊由不同尺寸且互不覆蓋的矩形構成的平板塗色。
為了塗色,APM需要使用一組刷子。每個刷子塗一種不同的顏色C。APM拿起一把有顏色C的刷子,並給所有顏色為C且符合下面限制的矩形塗色:
為了避免顏料滲漏使顏色混合,一個矩形只能在所有緊靠它上方的矩形塗色後,才能塗色。例如圖中矩形F必須在C和D塗色後才能塗色。註意,每一個矩形必須立刻塗滿,不能只塗一部分。
寫一個
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4using namespace std; 5 const int maxn=17; 6 const int INF=0x7f7f7f7f; 7 int map[maxn][maxn],dgr[maxn],vis[maxn]; 8 struct Tab{ 9 int x1,y1,x2,y2,col; 10 }tab[maxn]; 11 int ans=INF; 12 int n; 13 void pre(){ 14 for(int i=1;i<=n;i++){ 15 for(int j=1;j<=n;j++){ 16 if(tab[i].y2==tab[j].y1&&((tab[i].x1>=tab[j].x1&&tab[i].x1<=tab[j].x2)|| 17(tab[i].x2>=tab[j].x1&&tab[i].x2<=tab[j].x2)|| 18 (tab[i].x1>=tab[j].x1&&tab[i].x2<=tab[j].x2)|| 19 (tab[i].x1<=tab[j].x1&&tab[i].x2>=tab[j].x2) 20 )){21 map[i][j]=1;dgr[j]++; 22 } 23 } 24 } 25 } 26 void dfs(int cnt,int stp,int color){ 27 if(stp>=ans) return; 28 if(cnt==n){ans=min(ans,stp);return;} 29 for(int i=1;i<=n;i++){ 30 if(!vis[i]&&!dgr[i]){ 31 vis[i]=true; 32 for(int j=1;j<=n;j++) if(map[i][j]) dgr[j]--; 33 if(tab[i].col==color) dfs(cnt+1,stp,tab[i].col); 34 else dfs(cnt+1,stp+1,tab[i].col); 35 vis[i]=false; 36 for(int j=1;j<=n;j++) 37 if(map[i][j]) dgr[j]++; 38 } 39 } 40 } 41 42 int main(){ 43 cin>>n; 44 for(int i=1;i<=n;i++){ 45 cin>>tab[i].y1>>tab[i].x1>>tab[i].y2>>tab[i].x2>>tab[i].col; 46 } 47 pre(); 48 dfs(0,0,0); 49 cout<<ans<<endl; 50 return 0; 51 }
程序求一個使APM拿起刷子次數最少的塗色方案。註意,如果一把刷子被拿起超過一次,則每一次都必須記入總數中。
平板塗色