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;
}