poj 1691(dfs)
墙上有一面黑板,现划分为多个矩形,每个矩形都要涂上一种预设颜色C。由于涂色时,颜料会向下流,为了避免处于下方的矩形的颜色与上方流下来的颜料发生混合,要求在对矩形i着色时,处于矩形i上方直接相邻位置的全部矩形都必须已填涂颜色。在填涂颜色a时,若预设颜色为a的矩形均已着色,或暂时不符合着色要求,则更换新刷子,填涂颜色b。问最少需要的刷子次数(相同的颜色在不同的时间需要算多次。。自己应该想的清楚怎么回事吧。。。)。
利用dfs来枚举吧。。。情况不多。
View Code
1 // File Name: 1691.cpp 2 // Author: Missa 3 // Created Time: 2013/2/13 星期三 17:08:01 4 5 #include<iostream> 6 #include<cstdio> 7 #include<cstring> 8 #include<algorithm> 9 #include<cmath> 10 #include<queue> 11 #include<stack> 12 #include<string> 13 #include<vector> 14 #include<cstdlib> 15 #include<map> 16 #include<set> 17 using namespace std; 18 #define CL(x,v) memset(x,v,sizeof(x)); 19 20 const int maxn = 16; 21 int n; 22 struct rec 23 { 24 int ly,lx,ry,rx; 25 int c; 26 }r[maxn]; 27 int ind[maxn]; 28 vector<int>v[maxn]; 29 bool vis[maxn]; 30 bool ok(int i,int j) 31 { 32 if(r[i].ry!=r[j].ly) return false; 33 int tt=max(r[i].rx,r[j].rx)-min(r[i].lx,r[j].lx); 34 if(r[i].rx-r[i].lx + r[j].rx-r[j].lx<=tt) 35 return false; 36 return true; 37 } 38 int ans; 39 void dfs(int st,int step) 40 { 41 if(step>ans) return ; 42 // cout<<"st="<<st<<" step="<<step<<endl; 43 for(int i=0;i<v[st].size();i++) 44 ind[v[st][i]]--; 45 int tag=0; 46 for(int i=0;i<n;i++) 47 { 48 if(!vis[i] && ind[i]==0) 49 { 50 tag=1; 51 vis[i]=1; 52 if(r[st].c==r[i].c) 53 dfs(i,step); 54 else 55 dfs(i,step+1); 56 vis[i]=0; 57 } 58 } 59 for(int i=0;i<v[st].size();i++) 60 ind[v[st][i]]++; 61 if(!tag) 62 { 63 if(step<ans) 64 ans=step; 65 return ; 66 } 67 } 68 int main() 69 { 70 int t; 71 scanf("%d",&t); 72 while(t--) 73 { 74 scanf("%d",&n); 75 CL(ind,0); 76 CL(r,0); 77 CL(v,0); 78 CL(vis,0); 79 for(int i=0;i<n;i++) 80 scanf("%d%d%d%d%d",&r[i].ly,&r[i].lx,&r[i].ry,&r[i].rx,&r[i].c); 81 for(int i=0;i<n;i++) 82 for(int j=0;j<n;j++) 83 { 84 if(i==j) continue; 85 if(ok(i,j)) 86 { 87 v[i].push_back(j); 88 ind[j]++; 89 } 90 91 } 92 //for(int i=0;i<n;i++) 93 // cout<<ind[i]<<endl; 94 ans=n+1; 95 for(int i=0;i<n;i++) 96 { 97 // CL(vis,0); 98 if(ind[i]==0) 99 { 100 vis[i]=1; 101 dfs(i,1); 102 vis[i]=0; 103 } 104 } 105 printf("%d\n",ans); 106 } 107 return 0; 108 }