题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5113
爆搜+剪枝
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn=1000005;
int a[10][10];
int b[105];
int n,m,k;
int flag;
void dfs(int x,int y,int s)
{
int i,j;
if(s==0)
{
//printf("*******\n");
flag=1;
return ;
}
for(i=1;i<=k;i++)
{
if((s+1)/2<b[i])//剪枝,一开始没注意,T了一发
{
return ;
}
}
int xx,yy;
for(i=1; i<=k; i++)
{
if(a[x-1][y]!=i&&a[x][y-1]!=i&&b[i])
{
a[x][y]=i;
b[i]--;
//printf("%d %d\n",a[x][y],b[i]);
if(y+1>m)
{
yy=1;
xx=x+1;
}
else if(x+1>n)
{
yy=y+1;
xx=x;
}
else
{
xx=x;
yy=y+1;
}
//printf("%d %d\n",xx,yy);
dfs(xx,yy,s-1);
if(flag)
{
return ;
}
a[xx][yy]=0;
b[i]++;
}
}
}
int main()
{
int T,i,j;
int num=1;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
scanf("%d %d %d",&n,&m,&k);
for(i=1; i<=k; i++)
{
scanf("%d",&b[i]);
}
flag=0;
dfs(1,1,n*m);
printf("Case #%d:\n",num++);
if(flag)
{
printf("YES\n");
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
printf("%d%c",a[i][j],j==m?'\n':' ');
}
}
}
else
{
printf("NO\n");
}
}
return 0;
}