题意:
N*N的矩阵中有M个点能够放稻草人。且给覆盖距离R
每一个稻草人能覆曼哈顿距离R以内的点
问最少须要多少个稻草人
思路:
由于范围非常小,直接能够暴力
注意稻草人所在的位置是不须要被覆盖的
代码:
#include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #include"iostream" using namespace std; int map[55][55]; int n,m; int ans; struct point { int x,y,r; }p[11]; void dfs(int x,int sum) { if(x==m) { int f=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(map[i][j]!=0) continue; int k; for(k=0;k<m;k++) { if(map[p[k].x][p[k].y]==-1) continue; if(abs(i-p[k].x)+abs(j-p[k].y)<=p[k].r) break; } if(k==m) { f=0; break; } } if(!f) break; } if(f) ans=min(ans,sum); return ; } dfs(x+1,sum); map[p[x].x][p[x].y]=p[x].r; dfs(x+1,sum+1); map[p[x].x][p[x].y]=-1; } int main() { while(scanf("%d",&n),n) { memset(p,0,sizeof(p)); memset(map,0,sizeof(map)); scanf("%d",&m); for(int i=0;i<m;i++) { scanf("%d%d",&p[i].x,&p[i].y); map[p[i].x][p[i].y]=-1; } for(int i=0;i<m;i++) scanf("%d",&p[i].r); ans=99; dfs(0,0); printf("%d ",ans==99?-1:ans); } return 0; }