[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的,因此可以考虑搜索+剪枝。
从左到右,从上到下看当前格子能够染成什么颜色。
有一个限制性条件,就是说如果当前棋盘的格子数量的一半小于一种颜色的数量时,那么就一定有两个相邻的棋盘被染成了相同的颜色。
因为假设棋盘容量为cap,那么我们间隔着放颜色,最多能够放cap/2个。
因此就可以用限制性条件来剪枝。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef vector<int> vec;
typedef vector<vec> mat;
#define AA first
#define BB second int T,N,M,K;
int m[][];
int c[];
bool hasAns; bool C(int x,int y,int c){
int row = true, column = true;
if( x->=&&m[x-][y]==c ) column = false;
if( y->= && m[x][y-]==c ) row = false;
return row&&column;
} void dfs(int x,int y,int cur){
for(int i=;i<=K;i++){
if( c[i]>(cur+)/ ) return;
}
if(hasAns) return;
if( x==N+ ){
hasAns = true;
puts("YES");
for(int i=;i<=N;i++) {
for(int j=;j<=M;j++ ){
printf(j==M?"%d\n":"%d ",m[i][j]);
}
}
return;
}
for(int i=;i<=K;i++)if( c[i] ){
if( C(x,y,i) ){
c[i]--;
m[x][y] = i;
if( y==M ) dfs(x+,,cur-);
else dfs(x,y+,cur-);
c[i]++;
m[x][y] = ;
}
}
} int main(){
scanf("%d",&T);
for(int cases = ; cases <= T; cases++){
scanf("%d%d%d",&N,&M,&K);
for(int i=;i<=K;i++){
scanf("%d",&c[i]);
}
hasAns = false;
printf("Case #%d:\n",cases);
dfs(,,N*M);
if(!hasAns) puts("NO");
}
return ;
}
[HDU 5113] Black And White (dfs+剪枝)的更多相关文章
- HDU 5113 Black And White 回溯+剪枝
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...
- hdoj 5113 Black And White DFS+剪枝
Black And White Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) T ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Black And White(DFS+剪枝)
Black And White Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others ...
- hdu 5887 Herbs Gathering (dfs+剪枝 or 超大01背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5887 题解:这题一看像是背包但是显然背包容量太大了所以可以考虑用dfs+剪枝,贪心得到的不 ...
- 搜索(剪枝优化):HDU 5113 Black And White
Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...
- HDU 5113 Black And White ( 2014 北京区预赛 B 、搜索 + 剪枝 )
题目链接 题意 : 给出 n * m 的网格.要你用 k 种不同的颜色填给出的网格.使得相邻的格子颜色不同.若有解要输出具体的方案 分析 : 看似构造.实则搜索.手构构半天没有什么好想法 直接搜就行了 ...
- hdu 5113 Black And White
http://acm.hdu.edu.cn/showproblem.php?pid=5113 题意:给你n*m的格子,然后在每个格子内涂色,相邻格子不能同色,然后给你每个颜色涂的格子的固定个数,然后可 ...
- hdu 4277 USACO ORZ(dfs+剪枝)
Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pasture ...
随机推荐
- 深入理解ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- API文档中,<E>、<T>、<?>分别代表什么意思
although they are all type parameters, the convention is:E ElementT or S TypeK Key, as in <K, V&g ...
- C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换
用来与HTTP 模式的WCF 无缝隙切换. 服务端是MVC. 在Home/About 上面加 [HttpPost].读取Request.InputStream 中所有内容.然后返回JSON给客户端:r ...
- gcc中动态库和静态库的链接顺序
so文件:动态库a文件: 静态库exe文件:可执行程序(linux下以文件属性来标示是否是可执行文件,与后缀名无关) 经过自己写的一些测试程序,大致了解了下gcc中链接顺序问题,总结出以下几点:1,动 ...
- SIP 状态码
SIP应答消息状态码 与功能 类型 状态码 状态说明临时应答(1XX) 100 Trying 正在处理中180 Ringing 振铃181 call being forwarder 呼叫正在前向182 ...
- Akka(二) - Future
1. future的所有方法都是非阻塞立即返回的 (1)future都要有TimeOut和ExecutionContextExecutor这2个隐士参数 (2)打印future object Hell ...
- Java事务处理全解析(三)——丑陋的案例
在本系列的上一篇文章中,我们看到了一个典型的事务处理失败的案例,其主要原因在于,service层和各个DAO所使用的Connection是不一样的,而JDBC中事务处理的作用对象正是Connectio ...
- Android开发问题笔记
1.Toolbar问题:最低版本15,必须使用support,才能使用Toolbar,Toobar是5.0引入的 2.BottomTab:这个用TabLayout解决了 3.后端API最好采用一个成熟 ...
- OAF_EO系列5 - Update详解和实现(案例)
2014-06-14 Created By BaoXinjian
- BestCoder Round #84 Aaronson
Aaronson 题意: 给个中文链接:戳戳戳 题解: 这题一看给的公式就是二进制,之后马上就能想到当m大于等于二进制的位数时,输出n的二进制的1的个数就好了.之后就是m小于二进制的位数时,只要加上2 ...