首页 > 代码库 > hdu 5113 Black And White
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 }
hdu 5113 Black And White
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。