hdu5113Black And White dfs暴搜 +剪枝
2015-11-11 21:27
459 查看
//n(n<=5)*m(m<=5)的格子 //k种颜料,每种颜料有ai个 //问这k种颜料能否将这n*m涂满且 //每相邻的格子颜色不同 //暴搜 , 剪枝剩下的颜色的数量大于剩下(sum+1)/2 //直接return #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 30 ; int map[maxn][maxn] ; int a[maxn] ; int n , m , k ; bool dfs(int x , int y , int sum) { y++ ; if(y == m){ x++ ; y = 0 ; } if(x ==n){ return true ; } for(int i = 1;i <= k;i++) if(a[i] > (sum+1)/2)return false ; for(int i = 1;i <= k;i++) if(a[i]){ int px = x - 1 ; int py = y - 1 ; if(px >= 0 && map[px][y] == i) continue ; if(py >=0 && map[x][py] == i) continue ; map[x][y] = i ; a[i]-- ; if(dfs(x , y , sum-1))return true ; a[i]++ ; } return false ; } int main() { int t ; int cas = 0 ; scanf("%d" , &t) ; while(t--) { scanf("%d%d%d" , &n , &m , &k) ; for(int i = 1;i <= k;i++) scanf("%d" , &a[i]) ; printf("Case #%d:\n" , ++cas); if(dfs(0 , -1 , n*m)) { puts("YES") ; for(int i = 0;i < n;i++) for(int j = 0;j < m;j++) printf("%d%c" , map[i][j] , j == m - 1?'\n':' ') ; } else puts("NO") ; } return 0 ; }
相关文章推荐
- Linux终端bash美化教程
- poj 3692 Kindergarten 【最大团 = 补图最大独立集 = 补图节点数 - 补图最大匹配】
- Static块(静态代码块)
- 2015-2016 ACM ICPC Baltic Selection Contest [解题报告]
- nyoj--528--找球号(三)(位运算&&set)
- [273]Integer to English Words
- Mysql千万级别数据优化方案(单表)
- undname.exe的使用
- HDU 5527(Too Rich-贪心)
- XE6发布文件 在Deployment Manager中添加待发布的文件,Remote Path写入assets\internal\或assets\就可以
- nyoj--528--找球号(三)(位运算&&set)
- 排序算法-插入排序_直接插入排序
- 自定义spring schema简化与canal集成
- 诚风老师-直销十三步走
- iOS.swift 如何设置tableview禁止上下滚动
- ReAct 常用 的属性
- Broadcast广播的使用
- TimesTen 模拟锁表操作
- 正则pumping lemma和infeasible path
- sicily 1237. Paint Mix