题意;除了所给的一些点外,问能不能用1*2的矩形覆盖所有的点,矩形间不能重叠。
思路:简单二分匹配,,,,,,,
#include<stdio.h> #include<string.h> const int N=1200; int match[N],link[N],map[35][35],n,m; int dir[4][2]={0,1,0,-1,1,0,-1,0}; int find(int u) { int i,v,x,y,X,Y; x=u/m;y=u%m; for(i=0;i<4;i++) { X=x+dir[i][0]; Y=y+dir[i][1]; if(X<0||X>=n||Y<0||Y>=m||map[X][Y]==1)continue; v=X*m+Y; if(link[v]==0) { link[v]=1; if(match[v]==-1||find(match[v])==1) { match[v]=u;return 1; } } } return 0; } int main() { int i,k,x,y,sum,j; while(scanf("%d%d%d",&n,&m,&k)!=-1) { if((m * n - k) & 1) { printf("NO\n"); continue; } memset(map,0,sizeof(map)); for(i=0;i<k;i++) { scanf("%d%d",&x,&y); x--;y--; map[y][x]=1; } memset(match,-1,sizeof(match)); sum=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if((i+j)%2==1||map[i][j])continue; memset(link,0,sizeof(link)); sum+=find(i*m+j); } } if(sum*2+k==n*m) printf("YES\n"); else printf("NO\n"); } return 0; }