Black And White

来源:互联网 发布:mac终端是什么意思 编辑:程序博客网 时间:2024/05/20 14:26

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]);elseprintf(" %d",mp[i][j]);}printf("\n");}}else{printf("NO\n");}}}


原创粉丝点击