题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113
题面:
4 1 5 2 4 1 3 3 4 1 2 2 4 2 3 3 2 2 2 3 2 3 2 2 2
Case #1: NO Case #2: YES 4 3 4 2 1 2 4 3 4 Case #3: YES 1 2 3 2 3 1 Case #4: YES 1 2 2 3 3 1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <set>
#include <algorithm>
#include <string>
#include <iomanip>
#define LL long long
using namespace std;
int map [7][7],color[30];
int n,m,t,k,sz,amount,tmp;
bool flag=false;
void init()
{
for(int i=0;i<7;i++)
map[0][i]=-1;
for(int j=1;j<7;j++)
map[j][0]=-1;
}
void dfs(int x,int y,int typ,int lef)
{
tmp=(lef+1)/2;
for(int i=1;i<=k;i++)
{
if(color[i]>tmp)
return;
}
if(flag)return;
if(color[typ]==0)return;
if(map[x-1][y]!=typ&&map[x][y-1]!=typ)
{
map[x][y]=typ;
color[typ]--;
if(x==n&&y==m)
{
flag=true;
return;
}
else if(y==m)
{
tmp=0;
for(int i=1;i<=k;i++)
{
if(color[i])tmp++;
}
if(tmp==1)
{
if(m!=1)
{
color[typ]++;
return;
}
}
for(int i=1;i<=k;i++)
{
if(color[i])
dfs(x+1,1,i,lef-1);
}
}
else
{
for(int i=1;i<=k;i++)
{
if(color[i])
{
dfs(x,y+1,i,lef-1);
}
}
}
color[typ]++;
}
return;
}
int main()
{
init();
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
set <int> cnt;
printf("Case #%d:\n",i);
scanf("%d%d%d",&n,&m,&k);
amount=(n*m+1)/2;
flag=true;
if(k==1)
{
if(n*m!=1)
flag=false;
}
for(int j=1;j<=k;j++)
{
scanf("%d",&color[j]);
if(color[j]>amount)
flag=false;
}
if(flag)
{
flag=false;
for(int j=1;j<=k;j++)
{
sz=cnt.size();
if(color[j])
{
cnt.insert(color[j]);
if(cnt.size()>sz)
dfs(1,1,j,n*m);
}
}
}
if(flag)
{
printf("YES\n");
for(int j=1;j<=n;j++)
{
printf("%d",map[j][1]);
for(int k=2;k<=m;k++)
printf(" %d",map[j][k]);
printf("\n");
}
}
else
{
printf("NO\n");
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 5113 Black And White(DFS+剪枝)
原文:http://blog.csdn.net/david_jett/article/details/46916423