有一个包含从1到K一共K种颜色的N×M棋盘,使得任意两个相邻的区块不能有相同的颜色(如果它们的上、下、左、右任意一边的颜色与自身颜色不同)。第i种颜色可以被使用Ci次

思路:因为n,m较小,所以可以想到搜索,一行一行的给格子上色,首先这个颜色要有剩余并且不能和上面的和左边的颜色相同。

一个重要的剪枝:当剩下的格子个数为n时,任意一种颜色最多只能为(n+1)/2

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int mp[10][10];
int c[30];
int n,m,k,flag;
void dfs(int x,int y,int res)
{if(res==0||flag){flag=1;return;}for(int i=1;i<=k;i++){if(c[i]>(res+1)/2)return ;}for(int i=1;i<=k;i++){if(c[i]!=0){if(mp[x][y-1]!=i&&mp[x-1][y]!=i){mp[x][y]=i;c[i]--;if(y==m) dfs(x+1,1,res-1);else dfs(x,y+1,res-1);if(flag) return ;c[i]++;}}}
}
int main()
{int t,ca=1;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);memset(mp,0,sizeof(mp));flag=0;for(int i=1;i<=k;i++)scanf("%d",&c[i]);dfs(1,1,n*m);printf("Case #%d:\n",ca++);if(flag){printf("YES\n");for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(j==m) printf("%d\n",mp[i][j]);else printf("%d ",mp[i][j]);}}else printf("NO\n");}return 0;
}

转载于:https://www.cnblogs.com/Twsc/p/6774957.html

DFS+剪枝 hdu 5113 Black And White相关推荐

  1. HDU 5113 Black And White(搜索+剪枝)

    题意:给你一个不超过5X5的矩阵,有k种颜色,每种颜色有c[i]个,问可不可以把格子颜色涂满并且相邻格子的颜色不相同 思路:DFS搜索,不过会超时,留意到一个剪枝就是如果当前没有涂色的格子数目/2比最 ...

  2. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  3. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  4. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  5. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  6. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  7. hdu 1802 Black and white painting(置换群)

    题目链接:hdu 1802 Black and white painting 题意: 有一个n*n的格子,然后用c种颜色去涂,问你有多少种方案. 能旋转,反射的算一种方案. 题解: polya定理的经 ...

  8. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  9. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

最新文章

  1. android11有哪种手机,支持安卓11系统的机型有哪些
  2. android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
  3. Ajax updatepanel用法
  4. linux 后台计算,科学网-如何在Linux中做批处理和后台计算-张彦的博文
  5. java web 开发基础_javaweb开发基础(一)
  6. 前端笔记-vue cli引入sementic-ui(sementic-ui-vue)
  7. 一组PHP可逆加密解密算法
  8. ios 解压下载数据包(zip)
  9. supports-screens
  10. Reed-Solomon纠错码(RS码)(里德-所罗门码)
  11. 极客空间-MySQL实战45天-第二天
  12. Qt多线程使用 和 信号与槽传参 需要注意的问题
  13. Entity Framework自定义迁移历史表(EF6以上)
  14. pandas之dropna()的用法
  15. JVM——内存管理和垃圾回收
  16. 一文学会目前最火热的大数据技术
  17. 子网掩码的两种表示方法
  18. 楚列斯基分解法、求矩阵范数的C++实现
  19. 程序员500字年终总结
  20. django基于python的旅游网站--python-计算机毕业设计

热门文章

  1. Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy
  2. To be a true man
  3. linux搭建vsftpd虚拟用户访问
  4. 简易记事本实现与分析(三)主界面
  5. mysql全量备份与增量备份_Mysql增量备份与全量备份
  6. I2C,485,232,spi区别以半双工,全双工
  7. 终端下载文件(windows和linux)
  8. 网络爬虫--SAX处理xml
  9. 从源码分析DEARGUI之让怪物随机动起来
  10. 从源码分析DEARGUI之add_drawing