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 }

 

posted @ 2013-02-13 19:23  Missa  阅读(295)  评论(0编辑  收藏  举报