这道一个很经典的二分图问题,分别把x,y轴进行标号,有不同的地方进行建图,这样的话,让x,y轴进行匹配,求出最大匹配就好,这个难点在于标号。。我觉得是
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<sstream>
#include<queue>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define MAXN 2009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
#define clr(a) memset(a,0,sizeof(a))
#define clr1(a) memset(a,-1,sizeof(a))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
inline ll Max(ll a,ll b)
{
return a>b?a:b;
}
inline ll Min(ll a,ll b)
{
return a<b?a:b;
}
char mp[105][105];
int xi[105][105];
int yi[105][105];
int g[2005][2005];
int cx[2005],cy[2005];
int n,m;
int nx,ny;
int vis[2005];
int path(int u)
{
for(int v = 1; v<=ny; v++)
{
if(g[u][v]&&!vis[v])
{
vis[v] = 1;
if(cy[v]== -1||path(cy[v]))
{
cx[u] = v;
cy[v] = u;
return 1;
}
}
}
return 0;
}
int MaxMatch()
{
int res = 0;
clr1(cx);
clr1(cy);
for(int i = 1; i<=nx; i++)
{
if(cx[i]==-1)
{
clr(vis);
res+=path(i);
}
}
return res;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("an.txt","r", stdin);
#endif
int T;
scanf("%d",&T);
while(T--)
{
clr(xi);
clr(yi);
clr(g);
clr(mp);
scanf("%d%d",&n,&m);
for(int i = 0; i<n; i++)
scanf("%s",mp[i]);
int index = 0;
int flag = 0;
for(int i = 0; i<n; i++)
{
flag = 0;
for(int j = 0; j<m; j++)
{
if(mp[i][j]=='*')
{
if(!flag)
{
index++;
}
xi[i][j] = index;
flag = 1;
}
else if(mp[i][j]=='#')
{
flag = 0;
}
}
}
nx = index;
int indey = 0;
flag = 0;
for(int j = 0; j<m; j++)
{
flag = 0;
for(int i = 0; i<n; i++)
{
if(mp[i][j]=='*')
{
if(!flag)
indey++;
yi[i][j] = indey;
flag = 1;
}
else if(mp[i][j]=='#')
{
flag = 0;
}
}
}
ny = indey;
for(int i = 0; i<n; i++)
{
for(int j = 0; j<m; j++)
{
if(xi[i][j]&&yi[i][j])
{
//cout<<xi[i][j]<<" "<<yi[i][j]<<endl;
g[xi[i][j]][yi[i][j]] = 1;
}
}
}
// cout<<nx<<" "<<ny<<endl;
// for(int i = 0; i<n; i++)
// {
// for(int j = 0; j<m; j++)
// {
// cout<<xi[i][j]<<" ";
// }
// puts("");
// }
// puts("");
// for(int i = 0; i<n; i++)
// {
// for(int j = 0; j<m; j++)
// {
// cout<<yi[i][j]<<" ";
// }
// puts("");
// }
int ans = MaxMatch();
printf("%d\n",ans);
}
return 0;
}