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 导入导出命令(转载)
导出数据: mysqldump --databases -u root -p密码 数据库名> /root/guogl/XXX.sql 从sql文件导入数据: mysql -u root -p密码 ...
- DotNetBar MessageBoxEx 显示中文 显示office2007风格
MessageBoxEx显示消息的时候按钮是中文的解决这个问题设置 MessageBoxEx的UseSystemLocalizedString属性为 true. MessageBoxEx.UseSys ...
- angular cannot get /
每次遇到这问题都一脸懵逼,好像自己啥都没改咋就悲剧了 目前知道的办法是在命令行运行ng serve,它会告诉你详细错误 因为我是通过asp.net core的集成环境运行的,它没显示出详细错误
- UITableView基础入门
新建一个Single View Application 添加一个空类如下: using System; using UIKit; using Foundation; namespace BasicTa ...
- Html.DropDownListFor的选项值为字符型问题
我快要疯了.asp.net mvc的这个DropDownListFor,无论在服务器端如何设置,设置哪个值被选中,结果到了页面输出,选中值根本没有被选中,没有任何一个值被选中,下拉框只冷冰冰地显示一个 ...
- DIV+CSS常见问题的14条原因分析
当你在一个浏览器里面做好,在其他浏览器里面却完全不是那么回事情. 很多时候,我们就只是去修补下,或者利用各个浏览器对代码支持的不一致,进行针对各个浏览器进行不同的定义. 其实浏览器的不兼容,我们往 ...
- Xcode使用的一些小技巧,值得一看。
有时我们需要对一个已有项目进行重构,改进设计,提高代码质量.以下几个Xcode 4中的功能,会使重构的工作变得轻松很多. 1.打开项目我的项目是Xcode3.x中编辑的,在用Xcode 4 打开时出现 ...
- ps 工具栏使用
1:称动工具,快捷键是v,则选中移动工具:按shift和左键,可移动当前层移到另一层的中间对齐.如果不用sfhift键,则只是移动:alt+左键上移动,则复制层:alt+中间滚轮,则为放大和缩小. 2 ...
- 随机数生成程序代码( 伪随机<stdlib.h> )
#include <stdio.h> #include <string> #include <stdlib.h> #include <algorithm> ...
- 人生苦短之Python迭代器
迭代 在Python中,如果给定一个list或者touple,我们可以通过for循环来遍历,将值依次取出,这种遍历称为迭代. 在Python中是通过for...in..来进行遍历的,在Java中则是 ...