首页 > 其他 > 详细

dfs减枝回溯! HDU 5113

时间:2015-08-31 19:37:01      阅读:171      评论:0      收藏:0      [点我收藏+]
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int yy[60];
int g[30][30];
bool jud(int x,int y,int i){
    if(x<0||x>=n||y<0||y>=m) return true;
    if(g[x][y]!=i) return true;
    return false;
}
bool Cut(int step)
{
    int le = (n*m-step+1)/2;
    for(int i=0;i<k;i++)
    {
        if(le<yy[i]) return true;
    }
    return false;
}
bool dfs(int x,int y,int step){
    if(x==n) return true;
    if(y==m)  return dfs(x+1,0,step);
    if(Cut(step)) return false;
    for(int i=0;i<k;i++) if(yy[i])
    {
        int x1=x-1,y1=y;
        int x2=x,y2=y-1;
        if( jud(x1,y1,i)&&jud(x2,y2,i) )
        {
            yy[i]--;
            g[x][y]=i;
            if(dfs(x,y+1,step+1)) return true;
            yy[i]++;
        }
    }
    return false;
}
int main()
{
    int t,kase=0;scanf("%d",&t);
    while(t--){
        memset(g,0,sizeof(g));
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<k;i++) scanf("%d",&yy[i]);
        printf("Case #%d:\n",++kase);
        if(dfs(0,0,0)){
            printf("YES\n");
            for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(j==0) printf("%d",g[i][j]+1);
            else printf(" %d",g[i][j]+1);

        }

        printf("\n");
        }
        }
        else printf("NO\n");


    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

dfs减枝回溯! HDU 5113

原文:http://blog.csdn.net/a197p/article/details/48138291

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!