hdu 5113 Black And White
2015-09-10 00:25
441 查看
很好的一道题,题意:给你一个N*M的图,然后给你K种颜色,每种颜色都必须使用相应的次数,让你给图上色,使相邻的格子的颜色不相同
这题让我明白了搜索策略的重要性,开使直接dfs给每种颜色匹配相应的格子,结果是无限tle,还没发剪纸。
这题的正确搜索姿势应该是给每个格子去匹配相应的颜色。然后再剪纸
虽然看起来差不多,但是这2种搜索方式的效率却很大
这题让我明白了搜索策略的重要性,开使直接dfs给每种颜色匹配相应的格子,结果是无限tle,还没发剪纸。
这题的正确搜索姿势应该是给每个格子去匹配相应的颜色。然后再剪纸
虽然看起来差不多,但是这2种搜索方式的效率却很大
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int dir[4][2]={{-1,0},{0,-1}}; int n,m,k,casee=1,flag; int mapp[10][10]; int visit[10][10]; int c[30]; void init() { flag=0; memset(mapp,0,sizeof(mapp)); memset(visit,0,sizeof(visit)); } void input() { cin>>n>>m>>k; for(int i=1;i<=k;i++) cin>>c[i]; } int judge(int x,int y,int color) { int f=1; for(int i=0;i<2;i++) { int xx=x+dir[i][0],yy=y+dir[i][1]; if(xx<1||xx>n||yy<1||yy>m||!visit[xx][yy]) continue; if(mapp[xx][yy]==color) { f=0; break; } } return f; } void dfs(int cnt) { if(cnt==n*m) { flag=1; return; } for(int i=1;i<=k;i++) { if((n*m-cnt+1)/2<c[i]) return; } int x=cnt/m+1; int y=cnt%m+1; for(int i=1;i<=k;i++) { if(c[i]!=0&&judge(x,y,i)) { mapp[x][y]=i; c[i]--; visit[x][y]=1; dfs(cnt+1); if(flag) return; visit[x][y]=0; c[i]++; } } } void solve() { cout<<"Case "<<"#"<<casee++<<":"<<endl; dfs(0); if(flag) { cout<<"YES"<<endl; for(int i=1;i<=n;i++) { cout<<mapp[i][1]; for(int j=2;j<=m;j++) { cout<<" "<<mapp[i][j]; } cout<<endl; } } else cout<<"NO"<<endl; } int main() { cin.sync_with_stdio(false); int t; cin>>t; while(t--) { init(); input(); solve(); } return 0; }
相关文章推荐
- 【抽象代数】 07 - 因子分解和多项式环
- Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理
- Oracle Analyze 命令 详解
- 条款20:宁以pass-by-reference-to-const替换pass-by-value(Prefer pass-by-reference-to-const to pass-by-value)
- blkio.weight使用感想
- 08R2-12R2基于访问权限的文件枚举
- 08R2-12R2基于访问权限的文件枚举
- 移动 app 测试工具 bugtags
- 45个实用的JavaScript技巧、窍门和最佳实践
- FZU 2156 Climb Stairs
- Quick-Cocos2d-x初学者游戏教程(一)--------------------Quick的一些基础知识
- 利用顺序表实现多项式相加
- 2015年9月9日
- Centos 安装配置iscsi
- 图片的异步加载(双缓存)+ViewHolder
- 黑马程序员 abstract class和interface的区别
- redis conf文件解释
- 利用顺序表实现集合的并运算
- 转发和重定向的区别
- NSSearchPathForDirectoriesInDomains用法