题意:

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+剪枝】的更多相关文章

  1. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  3. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  4. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  5. DFS+剪枝 HDOJ 5323 Solve this interesting problem

    题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...

  6. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. LA 6476 Outpost Navigation (DFS+剪枝)

    题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...

  9. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

  10. 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 ...

随机推荐

  1. 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS

    一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...

  2. Android-运行时权限

    由于拨打电话数据用户的隐私,再者由于在5.0之后Android更注重于用户的隐私权限,为此出现了在低版本没有的问题,而在高版本出现的个别问题! Intent intent = new Intent(I ...

  3. 【BZOJ2625】[Neerc2009]Inspection 最小流

    [BZOJ2625][Neerc2009]Inspection Description You are in charge of a team that inspects a new ski reso ...

  4. mysql-test-run.pl

    wget https://raw.githubusercontent.com/mysql/mysql-server/5.7/mysql-test/mysql-test-run.pl

  5. define tensorflow and run it

    import tensorflow as tf a, b, c, d, e = tf.constant(5, name='input_a'), tf.constant(6, name='input_b ...

  6. 在Win7创建WiFi热点

    1.在开始菜单搜索cmd 2.运行cmd 3.输入以下命令,注意:Your-WiFi-Name和Your-WiFi-Password分别为WiFi名称和密码 netsh wlan set hosted ...

  7. 用css3技术给网站加分

    自己写了几个小DEMO,请打开http://codepen.io/shenggen/

  8. 大数据之环境准备系列 ——第二篇 新装VMware 虚拟机 网络配置(NAT模式)

    新安装虚拟机,需要配置网络环境,才可以使用ssh客户端(如xshell)远程登录 和 虚拟机访问Internet. 一. WMware 软件配置 WMware版本号:11.0.0 build-2305 ...

  9. mysql错误指令:Failed to open file "file_name" error 2/error 22

    网上说Linux下可能会有此问题,及导入sql文件时出现如标题所示的错误.而我用的是windows系统,也出现了同样的问题. source   filename | \. filename 执行这条语 ...

  10. 向HTML页面传入参数

    这次是想将参数传入HTML页面,通过js获取参数信息,动态生成HTML页面内容: 方法一: <script> function GetArgsFromHref(sHref, sArgNam ...