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 ...
随机推荐
- MySQL 数据类型转换
版权个人所有,欢迎转载如转载请说明出处.(东北大亨) http://www.cnblogs.com/northeastTycoon/p/5505523.html 网络越来越达到所以带来的好处不容置疑. ...
- Hibernate表关系映射之多对多映射
一.多对多的实现原理 在数据库中实现多对多的关系,必须使用连接表.也就是用一个独立的表来存入两个表的主键字段,通过遍历这张表来获取两表的关联关系. 而在我们的对象中,多对多是通过两者对象类中互相建立对 ...
- go map 线程不安全 安全措施
go map 线程不安全 安全措施
- javascript JSON.parse和eval的区别
SON.parse()用来将标准json字符串转换成js对象:eval()除了可以将json字符串(非标准的也可以,没有JSON.parse()要求严格)转换成js对象外还能用来动态执行js代码.例如 ...
- Android笔记之dp与px之间的转换以及LayoutParams
dp与px之间的转换公式 px = dp * (dpi / 160) dp = px / (dpi / 160) 其中dpi的获取方式如下 private void getDpi() { Displa ...
- HDOJ 4689 Derangement DP
DP具体解释见: http://blog.csdn.net/liguan1/article/details/10468139 Derangement Time Limit: 7000/7000 MS ...
- java中科学计数法数字转字符串
开发过程中有可能会遇到很小的数字,在显示过程中就转换成了科学计数法,这种不利于人的观看,于是就有必要转成字符串形式的.so. 将科学计数法的数字转换成字符串: 使用的是java.math的BigDec ...
- 深入浅出剖析C语言函数指针与回调函数(一)【转】
本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...
- HDU3605 Escape —— 二分图多重匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- 七号信令中TUP协议的主要消息和故障问题
CIC码说明: TUP消息的路由标记: 为OPC 24位 DPC24位 CIC 12位,12位CIC 的低5为时隙号,其中后4位为SLC,高7位为系统号. CIC配置需要注意几个问题: ...