• 平板涂色


    CE数码公司开发了一种名为自动涂色机(APM)的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。

    为了涂色,APM需要使用一组刷子。每个刷子涂一种不同的颜色C。APM拿起一把有颜色C的刷子,并给所有颜色为C且符合下面限制的矩形涂色:

    为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂色。例如图中矩形F必须在C和D涂色后才能涂色。注意,每一个矩形必须立刻涂满,不能只涂一部分。

    写一个

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using 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拿起刷子次数最少的涂色方案。注意,如果一把刷子被拿起超过一次,则每一次都必须记入总数中。

  • 相关阅读:
    A Year Of Books
    Spring Boot 之 RESRful API 权限控制
    Git回滚远程版本
    初探设计:Java接口和抽象类何时用?怎么用?
    深入浅出: Java回调机制(异步)
    深入浅出: 大小端模式
    Java IO 之 FileInputStream & FileOutputStream源码分析
    Java IO 之 OutputStream源码
    软件测试--安装软件
    Mybatis 中$与#的区别
  • 原文地址:https://www.cnblogs.com/lcan/p/9643220.html
Copyright © 2020-2023  润新知