求能出售多少个1*2的矩形,,将原图染色,(i+j)%2==0的染白色,其余为黑色,
求白色跟黑色的最大匹配
#include<stdio.h> #include<string.h> int n,m,ma[105][105],mark[105][105]; int dir[4][2]={-1,0, 0,-1, 1,0, 0,1}; struct linky { int x; int y; }link[105][105]; int pd(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m) return 1; return 0; } int find(int x,int y) { int i,a,b; for(i=0;i<4;i++) { a=x+dir[i][0]; b=y+dir[i][1]; if(pd(a,b)&&ma[a][b]==0&&mark[a][b]==0) { mark[a][b]=1; if(link[a][b].x==0||find(link[a][b].x,link[a][b].y)==1) { link[a][b].x=x; link[a][b].y=y; return 1; } } } return 0; } int main() { int i,t,x,y,sum,j,temp=0; while(scanf("%d%d",&n,&m),m&&n) { sum=0; memset(ma,0,sizeof(ma)); memset(link,0,sizeof(link)); scanf("%d",&t); for(i=1;i<=t;i++) { scanf("%d%d",&x,&y); ma[x][y]=1; } for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(ma[i][j]==0&&(i+j)%2==0)//(i+j)/2对原图染色,不同颜色间匹配 { memset(mark,0,sizeof(mark)); sum=sum+find(i,j); } } if(temp++>0) printf(" "); printf("%d ",sum); for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(link[i][j].x) printf("(%d,%d)--(%d,%d) ",i,j,link[i][j].x,link[i][j].y); } return 0; }