HDU 4462 DFS

68 篇文章 0 订阅

2012 Asia Hangzhou Regional Contest


给出N*N的矩阵,全部标记为0,其中有K个点标记为1,并且可以在该位置放置一个可以覆盖曼哈顿距离为r的草人,问最少放置几个草人,可以覆盖所有标记为0的点

DFS即可,注意只需要覆盖标记为0的点


#include "stdio.h"
#include "string.h"
int inf=0x3f3f3f3f;

int n,k,ans;
int x[11],y[11],w[11];
int hash[11];
int map[51][51];
int Fabs(int a)
{
    if (a<0) return -a;else return a;
}

void judge()
{
    int i,j,l,ok;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
        if (map[i][j]==0)
        {
            ok=0;
            for (l=1;l<=k;l++)
                if (hash[l]==1 && w[l]>=Fabs(i-x[l])+Fabs(j-y[l]))
                {
                    ok=1;
                    break;
                }
            if (ok==0) return ;
        }

    i=0;
    for (j=1;j<=k;j++)
        if (hash[j]==1) i++;
    if (i<ans) ans=i;
}

void dfs(int now)
{
    if (now>k) { judge();return ;}

    hash[now]=1;
    dfs(now+1);
    hash[now]=0;
    dfs(now+1);
}
int main()
{
    int i;
    while (scanf("%d",&n)!=EOF)
    {
        if (n==0) break;
        scanf("%d",&k);
        memset(map,0,sizeof(map));
        for (i=1;i<=k;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
            map[x[i]][y[i]]=1;
        }

        for (i=1;i<=k;i++)
            scanf("%d",&w[i]);
        ans=inf;

        memset(hash,0,sizeof(hash));
        dfs(1);
        if (ans==inf) printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值