HDU 5113 Black And White dfs+剪枝
2015-10-23 14:33
232 查看
题意:给你一个n*m的矩阵,现有K种颜料,要涂满整个矩阵。每种颜料可以涂的矩阵个数为c[i],涂矩阵时要求相邻矩阵颜色不同。现求一种合法的涂法。
方法:dfs+剪枝
剪枝技巧,对未填方块进行黑白染色,则需当前颜料的个数大于(left+1)/2个,才能使满足要求。
方法:dfs+剪枝
剪枝技巧,对未填方块进行黑白染色,则需当前颜料的个数大于(left+1)/2个,才能使满足要求。
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<time.h> #include<queue> using namespace std; const int N=6; bool flag; int num[N*N],n,m,K,left; int col ; void nextxy(int cx,int cy,int &nx,int &ny){ nx=cx;ny=cy; ny++; if(ny>m){ ny=1; nx++; } } bool dfs(int cx,int cy){ if(cx==n+1){ return true; } int ji=1; for(int i=1;i<=K;i++)if(num[ji]<num[i])ji=i; if(num[ji]>(left+1)/2)return false; int nx,ny; nextxy(cx,cy,nx,ny); for(int i=1;i<=K;i++)if(num[i]){ if(cx>1&&col[cx-1][cy]==i)continue; if(cy>1&&col[cx][cy-1]==i)continue; num[i]--; col[cx][cy]=i; left--; if(dfs(nx,ny))return true; left++; num[i]++; } return false; } void work(){ int T,tt=1; scanf("%d",&T); while(T--){ printf("Case #%d:\n",tt++); scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=K;i++) scanf("%d",&num[i]); left=n*m; flag=dfs(1,1); if(!flag){ puts("NO"); continue; } puts("YES"); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%d%c",col[i][j],j==m?'\n':' '); } } } } int main(){ //freopen("data_in.txt","r",stdin); work(); return 0; }
相关文章推荐
- 19+ JavaScript Shorthand Coding Techniques
- 文件下载2
- 优化程序性能 计算机系统结构 深入理解计算机系统
- Windows2008 Patching(打补丁)
- android 调试方法
- ImageView出现警告[Accessibility]Missing contentDescription attribute on image
- 图像三维形貌检测
- Flarum Story:我为什么开发 Flarum
- 概率-什么是一阶矩,二阶矩?
- 处理器体系结构
- 集算器如何处理文本计算——无结构运算
- QNX openGL ES 图形界面环境配置
- Android调用Jlibrtp库实现RTP发送数据
- UITabelView中cell点击展开功能设计
- Ubuntu 14.04 内核升级 详细步骤
- HttpClient中的 Get 和 Post (一个待优化的WebUtil)
- IOS导航栏颜色渐变与常用属性
- WinForm二三事(三)Control.Invoke&Control.BeginInvoke
- android studio 查看sha1(Mac windows下的问题都可以通过此解决)
- 并行计算