您的位置:首页 > 其它

Black And White

2017-11-04 00:58 218 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5113

一个就是我们要有顺序的来填充,一行一行的填充,还有就是剪枝的这个语句,真的比较难想,可能之后一想很简单,当时想的话,就感觉很难。

#include<cstdio>
#include<cstring>

const int maxn=10;
int mp[maxn][maxn];
int val[30];
int vis[maxn][maxn];
int n,m,k;
int flag;

int check(int col,int x,int y){
if(mp[x+1][y]==col||mp[x-1][y]==col||mp[x][y-1]==col||mp[x][y+1]==col)
return 0;
return 1;
}

void dfs(int x,int y,int num){
//printf("%d %d\n",x,y);
if(num==n*m){
flag=1;
return;
}
if(vis[x][y])
return;
for(int i=1;i<=k;i++){//这里是提前判断
if(val[i]>(n*m-num+1)/2)
return;
}
for(int i=1;i<=k;i++){
if(val[i]>0&&check(i,x,y)){
//printf("(%d,%d) :%d\n",x,y,i);
mp[x][y]=i;
vis[x][y]=1;
val[i]--;

if(y<m){ //一层一层的填充,如果到底了,我们就从下一行开始
dfs(x,y+1,num+1); if(flag) return;
}
else{
dfs(x+1,1,num+1); if(flag) return;
}
mp[x][y]=-1;
vis[x][y]=0;
val[i]++;
}
}
}

int main(){
int T;
scanf("%d",&T);
int cnt=1;
while(T--){
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=k;i++)
scanf("%d",&val[i]);
flag=0;
memset(mp,-1,sizeof(mp));
memset(vis,0,sizeof(vis));
dfs(1,1,0);
printf("Case #%d:\n",cnt++);
if(flag){
printf("YES\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j==1)
printf("%d",mp[i][j]);
else
printf(" %d",mp[i][j]);
}
printf("\n");
}
}
else{
printf("NO\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: