码迷,mamicode.com
首页 > 其他好文 > 详细

dfs减枝回溯! HDU 5113

时间:2015-08-31 19:39:25      阅读:161      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!