• hdu 5113 Black And White


    http://acm.hdu.edu.cn/showproblem.php?pid=5113

    题意:给你n*m的格子,然后在每个格子内涂色,相邻格子不能同色,然后给你每个颜色涂的格子的固定个数,然后可不可以实现,可以实现输出任意一种,否则输出NO

    思路:dfs枚举,剪纸,每种颜色剩余的个数不能超过剩余格子数的一半,如果剩余格子数是奇数,不能超过一半加1,偶数是一半。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #define maxn 100
      5 using namespace std;
      6 
      7 struct node
      8 {
      9     int c;
     10     int id;
     11     bool operator<(const node &a)const
     12     {
     13         return c>a.c;
     14     }
     15 }p[10000];
     16 int t,n,m,k;
     17 int c[maxn];
     18 int g[100][100];
     19 bool flag1;
     20 
     21 void dfs(int cc)
     22 {
     23     if(flag1) return;
     24     if(cc>=n*m) return ;
     25     for(int i=1; i<=k; i++)
     26     {
     27         if((n*m-cc)%2==0)
     28         {
     29           if(p[i].c>(n*m-cc)/2) return;
     30         }
     31         else
     32         {
     33             if(p[i].c>(n*m-cc)/2+1) return;
     34         }
     35     }
     36     int x=cc/m;
     37     int y=cc%m;
     38     for(int i=1; i<=k; i++)
     39     {
     40         if((g[x-1][y]==p[i].id&&x-1>=0)||(g[x][y-1]==p[i].id&&y-1>=0)) continue;
     41         if(p[i].c==0) continue;
     42         g[x][y]=p[i].id;
     43         p[i].c--;
     44         dfs(cc+1);
     45         p[i].c++;
     46         if(cc==n*m-1)
     47         {
     48             flag1=true;
     49             printf("YES
    ");
     50             for(int xx=0; xx<n; xx++)
     51             {
     52                 for(int yy=0; yy<m; yy++)
     53                 {
     54                     if(yy==0) printf("%d",g[xx][yy]);
     55                     else printf(" %d",g[xx][yy]);
     56                 }
     57                 printf("
    ");
     58             }
     59         }
     60     }
     61 }
     62 
     63 int main()
     64 {
     65     scanf("%d",&t);
     66     for(int cas=1; cas<=t; cas++)
     67     {
     68         scanf("%d%d%d",&n,&m,&k);
     69         for(int i=1; i<=k; i++)
     70         {
     71             scanf("%d",&c[i]);
     72             p[i].c=c[i];
     73             p[i].id=i;
     74         }
     75         sort(p+1,p+k+1);
     76         bool flag=true;
     77         for(int i=0; i<k; i++)
     78         {
     79             if((n*m)%2==0)
     80             {
     81                 if(c[i]>(n*m/2))
     82                 {
     83                     flag=false;
     84                     break;
     85                 }
     86             }
     87             else
     88             {
     89                 if(c[i]>((n*m)/2+1))
     90                 {
     91                     flag=false;
     92                     break;
     93                 }
     94             }
     95         }
     96         printf("Case #%d:
    ",cas);
     97         if(!flag)
     98         {
     99             printf("NO
    ");
    100             continue;
    101         }
    102         flag1=false;
    103         dfs(0);
    104         if(!flag1) printf("NO
    ");
    105     }
    106     return 0;
    107 }
    View Code
  • 相关阅读:
    软件工程结课作业
    第四次博客作业-结对项目
    软件工程第三次作业——关于软件质量保障
    20194744自动生成四则运算题第一版报告
    构建之法第一章
    dotNET面试(三)
    dotNET面试(二)
    dotNET面试(一)
    ebtables和iptables与linux bridge的交互
    自我认知(二)
  • 原文地址:https://www.cnblogs.com/fanminghui/p/4232032.html
Copyright © 2020-2023  润新知