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