DFS+剪枝 hdu 5113 Black And White
有一个包含从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相关推荐
- HDU 5113 Black And White(搜索+剪枝)
题意:给你一个不超过5X5的矩阵,有k种颜色,每种颜色有c[i]个,问可不可以把格子颜色涂满并且相邻格子的颜色不相同 思路:DFS搜索,不过会超时,留意到一个剪枝就是如果当前没有涂色的格子数目/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 ...
- 【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 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- hdu 1802 Black and white painting(置换群)
题目链接:hdu 1802 Black and white painting 题意: 有一个n*n的格子,然后用c种颜色去涂,问你有多少种方案. 能旋转,反射的算一种方案. 题解: polya定理的经 ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
- poj2248 DFS+剪枝 or BFS
传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...
最新文章
- android11有哪种手机,支持安卓11系统的机型有哪些
- android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
- Ajax updatepanel用法
- linux 后台计算,科学网-如何在Linux中做批处理和后台计算-张彦的博文
- java web 开发基础_javaweb开发基础(一)
- 前端笔记-vue cli引入sementic-ui(sementic-ui-vue)
- 一组PHP可逆加密解密算法
- ios 解压下载数据包(zip)
- supports-screens
- Reed-Solomon纠错码(RS码)(里德-所罗门码)
- 极客空间-MySQL实战45天-第二天
- Qt多线程使用 和 信号与槽传参 需要注意的问题
- Entity Framework自定义迁移历史表(EF6以上)
- pandas之dropna()的用法
- JVM——内存管理和垃圾回收
- 一文学会目前最火热的大数据技术
- 子网掩码的两种表示方法
- 楚列斯基分解法、求矩阵范数的C++实现
- 程序员500字年终总结
- django基于python的旅游网站--python-计算机毕业设计
热门文章
- Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy
- To be a true man
- linux搭建vsftpd虚拟用户访问
- 简易记事本实现与分析(三)主界面
- mysql全量备份与增量备份_Mysql增量备份与全量备份
- I2C,485,232,spi区别以半双工,全双工
- 终端下载文件(windows和linux)
- 网络爬虫--SAX处理xml
- 从源码分析DEARGUI之让怪物随机动起来
- 从源码分析DEARGUI之add_drawing