HDU5113【DFS+剪枝】
题意:
n*m的矩阵
k种颜色
每种颜色有c[i]个
上下左右相邻的格子不能一样的颜色
问你有没有一种染色方法,有的话输出方案。
思路:
暴搜啊,n,m都才5,做完以后大哥的剪枝是奇偶剪枝,其实画完图我就应该想到了。然后自己想了好多,关于奇偶剪枝,自己也就做了HDU1010而已吧。
然后自己的思路,一开始暴搜无剪枝T了,然后想到了最终两种颜色的时候一定是相等的,剩下的一半,然后还是T,这个剪枝还是不强,然后首先判一下每种颜色的数量是小于n*m/2的,那么就会想到每次的话就是都要小于n*m/2的;
然后wa了。然后改啊改。。。最后发现每次dfs以后那个颜色数组会变。。没更新。。。= =、太久没写搜索了,真菜,还要搞搞奇偶剪枝;
巨挫的code………
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e4+10;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
int c[30];
int ss[30];
int ma[10][10];
int vis[10][10];
int flag;
int n,m,num;
bool judge(int x,int y,int temp)//判断这个点能不能放j颜色
{
for(int i=0;i<4;i++)
{
int xx=dx[i]+x;
int yy=dy[i]+y;
if(xx<1||yy<1||xx>n||yy>m)
continue;
if(vis[xx][yy])
if(ma[xx][yy]==temp)
return false;
}
return true;
}
bool Judhe(int temp)//剪枝,小于剩下的二分之一
{
for(int j=2;j<=num;j++)
{
if(c[j]>temp/2)
return false;
}
return true;
}
void dfs(int x,int y,int sum)//搜。。
{
if(flag)
return;
if(sum==n*m)
{
flag=1;
return;
}
if(!Judhe(n*m-sum+1))
return;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<1||yy<1||xx>n||yy>m||vis[xx][yy])
continue;
for(int j=1;j<=num;j++)
{
if(c[j])
{
if(judge(xx,yy,j))
{
ma[xx][yy]=j;
vis[xx][yy]=1;
c[j]--;
dfs(xx,yy,sum+1);
if(flag)
return;
vis[xx][yy]=0;
c[j]++;
}
}
}
}
}
//每次DFS以后,C[]数组改变!!!!一定要注意DFS后的后果,而且要注意必要的初始化处理。
void init()
{
for(int j=1;j<=num;j++)
c[j]=ss[j];
}
int main()
{
int T;
int cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&num);
for(int i=1;i<=num;i++)
{
scanf("%d",&ss[i]);
}
printf("Case #%d:\n",cas++);
int f1=0;
init();
for(int i=1;i<=num;i++)
{
if(c[i]>((n*m+1)/2))
{
f1=1;
puts("NO");
break;
}
}
if(f1)
continue;
flag=0;
for(int i=1;i<=num;i++)
{
init();
memset(vis,0,sizeof(vis));
if(c[i])
{
c[i]--;
vis[1][1]=1;
ma[1][1]=i;
dfs(1,1,1);
}
// puts("");
// for(int j=1;j<=n;j++)
// {
// printf("%d ",c[j]);
// }
// puts("");
if(flag)
break;
}
if(flag==1)
{
puts("YES");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j!=1)
printf(" ");
printf("%d",ma[i][j]);
}
puts("");
}
}
else
puts("NO");
}
return 0;
}
HDU5113【DFS+剪枝】的更多相关文章
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- LA 6476 Outpost Navigation (DFS+剪枝)
题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- 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 ...
随机推荐
- 图像处理中的数学原理具体解释21——PCA实例与图像编码
欢迎关注我的博客专栏"图像处理中的数学原理具体解释" 全文文件夹请见 图像处理中的数学原理具体解释(总纲) http://blog.csdn.net/baimafujinji/ar ...
- MySQL 更新和删除
更新和删除的操作SQL语句比較简单,只是要注意使用UPDATE的时候.要注意WEHER条件的限制,以下的语句是仅仅更新id为10005的email地址,假设不加WHERE语句限制,那么将表中全部的em ...
- EasyIPCamera实现Windows PC桌面、安卓Android桌面同屏直播,助力无纸化会议系统
最近在EasyDarwin开源群里,有不少用户私信需求,要做一种能够多端同屏的系统,细分下来有屏幕采集端和同屏端,屏幕采集端细想也就是一个低延时的流媒体音视频服务器,同屏端也就是一个低延时的播放器,负 ...
- EasyDarwin开源音频解码项目EasyAudioDecoder:基于ffmpeg的安卓音频(AAC、G726)解码库(第一部分,ffmpeg-android的编译)
ffmpeg是一套开源的,完整的流媒体解决方案.基于它可以很轻松构建一些强大的应用程序.对于流媒体这个行业,ffmpeg就像圣经一样的存在.为了表达敬意,在这里把ffmpeg官网的一段简介搬过来,ff ...
- 九度OJ 1131:合唱队形 (DP、最长上升下降序列)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2865 解决:881 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. ...
- redis的主从复制和哨兵支持的主从切换
1 主从复制的目的是为了读写分离 master写,然后同步到slave,slave只管读. 2 哨兵存在的目的 是为了主从切换,如果master挂了,那么一个slave成为master,重启之后的ma ...
- Vue 组件实例属性的使用
前言 因为最近面试了二.三十个人,发现大部分都还是只是停留在 Vue 文档的教程.有部分连教程这部分的文档也没看全.所以稍微写一点,让新上手的 Vuer 多了解 Vue 文档的其他更需要关注的点. 因 ...
- css中IE判断语句 if !IE
1. <!–[if !IE]><!–> 除IE外都可识别 <!–<![endif]–> 2. <!–[if IE]> 所有的IE可识别 <! ...
- Android如何配置init.rc中的开机启动进程(service)【转】
本文转载自:http://blog.csdn.net/qq_28899635/article/details/56289063 开篇:为什么写这篇文章 先说下我自己的情况,我是个普通的大四学生,之前在 ...
- Android 启动过程介绍【转】
本文转载自:http://blog.csdn.net/yangwen123/article/details/8023654 一般开机过程大致可以分为三个大阶段: 1. OS级别,由bootloader ...