题意:
中文题
思路:
想到是一个重复覆盖的问题,然后就是最少放多少个能覆盖满。
建图的话就是先标记一下哪些点有怪物,最多就是n*m个怪物。
然后就是行。
行的话就看输入的x和y能框住多少的范围了。
然后四重循环遍历一遍建边就ok了。
代码:
#include"stdio.h" #include"algorithm" #include"string.h" #include"iostream" #include"cmath" #include"queue" #include"map" #include"vector" #include"string" using namespace std; #define N 230*230 #define RN 20*20 #define CN 20*20 struct DLX { int n,m,C; int U[N],D[N],L[N],R[N],Row[N],Col[N]; int H[RN],S[CN],cnt,ans[RN]; void init(int _n,int _m) { n=_n; m=_m; for(int i=0; i<=m; i++) { S[i]=0; U[i]=D[i]=i; L[i]=(i==0?m:i-1); R[i]=(i==m?0:i+1); } C=m; for(int i=1; i<=n; i++) H[i]=-1; } void link(int x,int y) { C++; Row[C]=x; Col[C]=y; S[y]++; U[C]=U[y]; D[C]=y; D[U[y]]=C; U[y]=C; if(H[x]==-1) H[x]=L[C]=R[C]=C; else { L[C]=L[H[x]]; R[C]=H[x]; R[L[H[x]]]=C; L[H[x]]=C; } } void del(int x) { for(int i=D[x]; i!=x; i=D[i]) { R[L[i]]=R[i]; L[R[i]]=L[i]; } } void rec(int x) { for(int i=U[x]; i!=x; i=U[i]) { R[L[i]]=i; L[R[i]]=i; } } int used[CN]; int h() { int sum=0; for(int i=R[0]; i!=0; i=R[i]) used[i]=0; for(int i=R[0]; i!=0; i=R[i]) { if(used[i]==0) { sum++; used[i]=1; for(int j=D[i]; j!=i; j=D[j]) for(int k=R[j]; k!=j; k=R[k]) used[Col[k]]=1; } } return sum; } void dance(int x) { if(x+h()>=cnt) return; if(R[0]==0) { cnt=min(cnt,x); return ; } int now=R[0]; for(int i=R[0]; i!=0; i=R[i]) { if(S[i]<S[now]) now=i; } for(int i=D[now]; i!=now; i=D[i]) { del(i); for(int j=R[i]; j!=i; j=R[j]) del(j); dance(x+1); for(int j=L[i]; j!=i; j=L[j]) rec(j); rec(i); } return ; } } dlx; int mp[20][20]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=-1) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&mp[i][j]); int cnt=0; int x,y; scanf("%d%d",&x,&y); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mp[i][j]==1) mp[i][j]=++cnt; } } dlx.init((n-x+1)*(m-y+1),cnt); int sum=1; for(int i=1;i<=n-x+1;i++) { for(int j=1;j<=m-y+1;j++) { for(int a=0;a<x;a++) { for(int b=0;b<y;b++) { if(mp[i+a][j+b]!=0) { dlx.link(sum,mp[i+a][j+b]); } } } sum++; } } dlx.cnt=999; dlx.dance(0); printf("%d\n",dlx.cnt); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-20 22:56:13