• 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 }
  • 相关阅读:
    小学四则算式扩充
    软件工程初涉之感
    回头
    个人最终总结
    团队作业
    结对编程
    老李的blog使用日记(3)
    进度
    老李的blog使用日记(2)
    红果果
  • 原文地址:https://www.cnblogs.com/Missa/p/2910891.html
Copyright © 2020-2023  润新知