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 }

时间: 2024-08-05 06:40:00

hdu 5113 Black And White的相关文章

HDU 5113 Black And White(DFS+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题面: Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 1336    Accepted Submission(s): 350 Special Judge Problem Description I

[HDU 5113] Black And White (dfs+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题目大意:给你N*M的棋盘,K种颜色,每种颜色有c[i]个(sigma(c[i]) = N*M),现在给棋盘染色,使得相邻的两个棋盘染成不同的颜色,并且把所有颜色用完. 因为棋盘最大为5*5的,因此可以考虑搜索+剪枝. 从左到右,从上到下看当前格子能够染成什么颜色. 有一个限制性条件,就是说如果当前棋盘的格子数量的一半小于一种颜色的数量时,那么就一定有两个相邻的棋盘被染成了相同的颜色. 因为假

hdu 5113 Black And White (dfs回溯+剪枝)

Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 854    Accepted Submission(s): 218 Special Judge Problem Description In mathematics, the four color theorem, or the four color

HDU 5113 Black And White(暴力dfs+减枝)

题目大意:给你一个n×m的矩阵,然后给你k种颜色,每种颜色有x种,所有的个数加起来恰好为n×m个.问你让你对这个矩阵进行染色问你,能不能把所有的小方格都染色,而且相邻两个颜色不同. 思路:一开始想的是构造,先按照个数进行排序,枚举每一个位置,贪心的策略先放多的,如果可以全部放下就输出YES,以及存贮的方案,否则输出NO,但是有bug,一直不对... 正解:dfs暴力枚举每一个点,裸的话需要25!,显然会超时,需要先排个序用构造的策略,让多的先放这样可以减枝.然后再dfs就可以了. Black A

hdu 5113 Black And White, 黑白染色,技巧

Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 485    Accepted Submission(s): 131 Special Judge Problem Description In mathematics, the four color theorem, or the four color

搜索(剪枝优化):HDU 5113 Black And White

Description In mathematics, the four color theorem, or the four color map theorem, states that, given any separation of a plane into contiguous regions, producing a figure called a map, no more than four colors are required to color the regions of th

HDU 5113 Black And White (dfs)

题目链接: 传送门 题意: 给定你一个n*m的格子,然后k种颜色给这个图涂色,要求 相邻的两个格子的颜色不相同(四个方向),而且第i种颜 色恰好出现c[i]次,问能否给这个图涂色成功. 分析: 首先我们考虑一种情况,n*m的格子用一种颜色给他涂色,保 证相邻的格子的颜色不同那么最多可以涂(m*n+1)/2 ,那么 我们搜索的时候可以直接根据这个条件来剪枝了.然后从下 到上一层一层的进行涂色. 代码如下: #include <iostream> #include <cstdio> #

HDU 5113 Black And White ( 2014 北京区预赛 B 、搜索 + 剪枝 )

题目链接 题意 : 给出 n * m 的网格.要你用 k 种不同的颜色填给出的网格.使得相邻的格子颜色不同.若有解要输出具体的方案 分析 : 看似构造.实则搜索.手构构半天没有什么好想法 直接搜就行了.注意加上剪枝 当剩下格子不足以让剩下颜色数量最多的颜色产生间隔的话则返回 具体也很好实现.即 max( 剩下的最多数量的那种颜色的数量 ) > ( 还剩多少格子 + 1 ) / 2 #include<bits/stdc++.h> using namespace std; const int

hust 1546 &amp;&amp; hdu 3911 Black And White

题目描述 There are a bunch of stones on the beach; Stone color is white or black. Little Sheep has a magic brush, she can change the color of a continuous stone, black to white, white to black. Little Sheep like black very much, so she want to know the l