二分图匹配水题
#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
#define MAX 50
using namespace std;
char pic[MAX][MAX];
int diff[]={-1,0,1,0,0,-1,0,1};
bool interest[MAX*MAX],map[MAX*MAX][MAX*MAX],used[MAX*MAX];
int mat[MAX*MAX];
bool find(const int &x,const int &n)
{
for(int i=0;i<n;++i)
{
if(map[x][i] && !used[i] && interest[i])
{
used[i]=true;
if(mat[i]==-1 || find(mat[i],n))
{
mat[i]=x;
return true;
}
}
}
return false;
}
int main(void)
{
#ifdef DEBUG
freopen("../stdin.txt","r",stdin);
freopen("../stdout.txt","w",stdout);
#endif
int h,w,ncases;
scanf("%d",&ncases);
while(ncases--)
{
scanf("%d%d",&h,&w);
memset(pic,'o',sizeof(pic));
memset(map,0,sizeof(map));
memset(mat,-1,sizeof(mat));
memset(interest,false,sizeof(interest));
getchar();
for(int i=1;i<=h;++i)
gets(pic[i]+1);
int cnt=0;
for(int i=1;i<=h;++i)
for(int j=1;j<=w;++j)
if(pic[i][j]=='*')
{
++cnt;
interest[(i-1)*w+j-1]=true;
for(int k=0;k<8;k+=2)
{
int a=i+diff[k];
int b=j+diff[k+1];
if(pic[a][b]=='*')
map[(i-1)*w+j-1][(a-1)*w+b-1] = map[(a-1)*w+b-1][(i-1)*w+j-1]=1;
}
}
int n=h*w;
int ans=0;
for(int i=0;i<n;++i)
{
memset(used,false,sizeof(used));
if(interest[i])
if(find(i,n))
++ans;
}
printf("%d\n",cnt-ans+ans/2);
}
return 0;
}