首页 > 代码库 > HDU 4462
HDU 4462
http://acm.hdu.edu.cn/showproblem.php?pid=4462
一道题意不清的水题
题意:给一个n*n的格子,在上面放草人,每个草人有恐惧范围,问最少选择几个草人可以覆盖所有格子
解法:草人个数只有10,暴力即可,dfs或者状压枚举。距离指的是曼哈顿距离,已经有草人的格子,不管你选不选都是不用计算的
注意:可能有0的情况,即所有格子放满草人
#include <iostream>#include <cstdio>#include <cstring>using namespace std ;int r[15],c[15],a[15],R[15] ;int vis[55][55] ;int ABS(int x){ return x>0?x:-x ;}int main(){ int n,k ; while(~scanf("%d",&n),n) { scanf("%d",&k) ; memset(vis,0,sizeof(vis)) ; for(int i=0 ;i<k ;i++) { scanf("%d%d",&r[i],&c[i]) ; vis[r[i]][c[i]]=1 ; } for(int i=0 ;i<k ;i++) scanf("%d",&R[i]) ; if(k==n*n) { puts("0") ; continue ; } int s=(1<<k) ; int ans=0xfffffff ; for(int i=0 ;i<s ;i++) { int st=0 ; for(int j=0 ;j<k ;j++) { if(i&(1<<j))a[st++]=j ; } int flag ; for(int j=1 ;j<=n ;j++) { for(int h=1 ;h<=n ;h++) { if(vis[j][h])continue ; flag=0 ; for(int l=0 ;l<st ;l++) { if(ABS(j-r[a[l]])+ABS(h-c[a[l]])<=R[a[l]]) { flag=1 ; break ; } } if(!flag)break ; } if(!flag)break ; } if(!flag)continue ; ans=min(ans,st) ; } if(ans==0xfffffff)puts("-1") ; else printf("%d\n",ans) ; } return 0 ;}
HDU 4462
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。