hdu 5113 Black And White

时间:2024-01-20 22:54:51

http://acm.hdu.edu.cn/showproblem.php?pid=5113

题意:给你n*m的格子,然后在每个格子内涂色,相邻格子不能同色,然后给你每个颜色涂的格子的固定个数,然后可不可以实现,可以实现输出任意一种,否则输出NO

思路:dfs枚举,剪纸,每种颜色剩余的个数不能超过剩余格子数的一半,如果剩余格子数是奇数,不能超过一半加1,偶数是一半。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100
using namespace std; struct node
{
int c;
int id;
bool operator<(const node &a)const
{
return c>a.c;
}
}p[];
int t,n,m,k;
int c[maxn];
int g[][];
bool flag1; void dfs(int cc)
{
if(flag1) return;
if(cc>=n*m) return ;
for(int i=; i<=k; i++)
{
if((n*m-cc)%==)
{
if(p[i].c>(n*m-cc)/) return;
}
else
{
if(p[i].c>(n*m-cc)/+) return;
}
}
int x=cc/m;
int y=cc%m;
for(int i=; i<=k; i++)
{
if((g[x-][y]==p[i].id&&x->=)||(g[x][y-]==p[i].id&&y->=)) continue;
if(p[i].c==) continue;
g[x][y]=p[i].id;
p[i].c--;
dfs(cc+);
p[i].c++;
if(cc==n*m-)
{
flag1=true;
printf("YES\n");
for(int xx=; xx<n; xx++)
{
for(int yy=; yy<m; yy++)
{
if(yy==) printf("%d",g[xx][yy]);
else printf(" %d",g[xx][yy]);
}
printf("\n");
}
}
}
} int main()
{
scanf("%d",&t);
for(int cas=; cas<=t; cas++)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=; i<=k; i++)
{
scanf("%d",&c[i]);
p[i].c=c[i];
p[i].id=i;
}
sort(p+,p+k+);
bool flag=true;
for(int i=; i<k; i++)
{
if((n*m)%==)
{
if(c[i]>(n*m/))
{
flag=false;
break;
}
}
else
{
if(c[i]>((n*m)/+))
{
flag=false;
break;
}
}
}
printf("Case #%d:\n",cas);
if(!flag)
{
printf("NO\n");
continue;
}
flag1=false;
dfs();
if(!flag1) printf("NO\n");
}
return ;
}