HDU 5113 Black And White (dfs)

题目链接: 传送门

题意:

给定你一个n*m的格子,然后k种颜色给这个图涂色,要求

相邻的两个格子的颜色不相同(四个方向),而且第i种颜

色恰好出现c[i]次,问能否给这个图涂色成功。

分析:

首先我们考虑一种情况,n*m的格子用一种颜色给他涂色,保

证相邻的格子的颜色不同那么最多可以涂(m*n+1)/2 ,那么

我们搜索的时候可以直接根据这个条件来剪枝了。然后从下

到上一层一层的进行涂色。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#define PB push_back
#define MP make_pair
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define DWN(i,h,l) for(int i=(h);i>=(l);--i)
#define IFOR(i,h,l,v) for(int i=(h);i<=(l);i+=(v))
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define MAX3(a,b,c) max(a,max(b,c))
#define MAX4(a,b,c,d) max(max(a,b),max(c,d))
#define MIN3(a,b,c) min(a,min(b,c))
#define MIN4(a,b,c,d) min(min(a,b),min(c,d))
#define PI acos(-1.0)
#define INF 1000000000
#define LINF 1000000000000000000LL
#define eps 1e-8
#define LL long long
using namespace std;

const int maxn = 26;

int mp[maxn][maxn];
int c[maxn];
int n,m,k;
bool tag;

bool check(int x,int y,int color){//判断是否是不同色
    bool flag = true;
    if(x-1>=1&&mp[x-1][y]==color) flag = false;
    if(y-1>=1&&mp[x][y-1]==color) flag = false;
    return flag;
}

void dfs(int x,int y,int num){//搜索到(x,y)剩余num个格子可以用。
    if(tag) return ;
    FOR(i,1,k){
        if(c[i]>(num+1)/2)
            return;
    }
    if(x==n+1){//可以涂到第n+1层的话那么很明显前n层是有解的
        tag = true;
        puts("YES");
        FOR(i,1,n){
            FOR(j,1,m){
                if(j==m) printf("%d\n",mp[i][j]);
                else printf("%d ",mp[i][j]);
            }
        }
        return ;
    }
    FOR(i,1,k){//枚举可以涂的颜色
        if(c[i]&&check(x,y,i)){
            c[i]--,mp[x][y]=i;
            if(y==m) dfs(x+1,1,num-1);
            else dfs(x,y+1,num-1);
            c[i]++,mp[x][y]=0;
        }
    }
}

int main(){
    int t,cas=1;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&m,&k);
        FOR(i,1,k) scanf("%d",c+i);
        printf("Case #%d:\n",cas++);
        tag=false;
        dfs(1,1,m*n);
        if(!tag) puts("NO");
    }
    return 0;
}
时间: 2024-10-10 23:28:13

HDU 5113 Black And White (dfs)的相关文章

[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的,因此可以考虑搜索+剪枝. 从左到右,从上到下看当前格子能够染成什么颜色. 有一个限制性条件,就是说如果当前棋盘的格子数量的一半小于一种颜色的数量时,那么就一定有两个相邻的棋盘被染成了相同的颜色. 因为假

HDU 5113 Black And White(DFS+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题面: Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 1336    Accepted Submission(s): 350 Special Judge Problem Description I

hdu 5113 Black And White (dfs回溯+剪枝)

Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 854    Accepted Submission(s): 218 Special Judge Problem Description In mathematics, the four color theorem, or the four color

HDU 5113 Black And White(暴力dfs+减枝)

题目大意:给你一个n×m的矩阵,然后给你k种颜色,每种颜色有x种,所有的个数加起来恰好为n×m个.问你让你对这个矩阵进行染色问你,能不能把所有的小方格都染色,而且相邻两个颜色不同. 思路:一开始想的是构造,先按照个数进行排序,枚举每一个位置,贪心的策略先放多的,如果可以全部放下就输出YES,以及存贮的方案,否则输出NO,但是有bug,一直不对... 正解:dfs暴力枚举每一个点,裸的话需要25!,显然会超时,需要先排个序用构造的策略,让多的先放这样可以减枝.然后再dfs就可以了. Black A

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 <al

HDOJ 5113 Black And White DFS+剪枝

DFS+剪枝... 在每次DFS前,当前棋盘的格子数量的一半小于一种颜色的数量时就剪掉 Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 194    Accepted Submission(s): 50 Special Judge Problem Description In mathematics,

搜索(剪枝优化):HDU 5113 Black And White

Description In mathematics, the four color theorem, or the four color map theorem, states that, given any separation of a plane into contiguous regions, producing a figure called a map, no more than four colors are required to color the regions of th

hdu 5113 Black And White, 黑白染色,技巧

Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 485    Accepted Submission(s): 131 Special Judge Problem Description In mathematics, the four color theorem, or the four color

HDU 5113 Black And White ( 2014 北京区预赛 B 、搜索 + 剪枝 )

题目链接 题意 : 给出 n * m 的网格.要你用 k 种不同的颜色填给出的网格.使得相邻的格子颜色不同.若有解要输出具体的方案 分析 : 看似构造.实则搜索.手构构半天没有什么好想法 直接搜就行了.注意加上剪枝 当剩下格子不足以让剩下颜色数量最多的颜色产生间隔的话则返回 具体也很好实现.即 max( 剩下的最多数量的那种颜色的数量 ) > ( 还剩多少格子 + 1 ) / 2 #include<bits/stdc++.h> using namespace std; const int