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\n");
 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("\n");
 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:\n",cas);
 97         if(!flag)
 98         {
 99             printf("NO\n");
100             continue;
101         }
102         flag1=false;
103         dfs(0);
104         if(!flag1) printf("NO\n");
105     }
106     return 0;
107 }
View Code

 

posted @ 2015-01-18 18:09  null1019  阅读(266)  评论(0编辑  收藏  举报