Battle ships
http://acm.hdu.edu.cn/showproblem.php?pid=5093
注意数组大小, 因为分块所以要将匹配用到的数组开大点
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
#define ms(x) memset(x, 0, sizeof(x))
using namespace std;
const int N = 53;
int a[N][N], b[N][N];
int used[N*N], linked[N*N][N*N], match[N*N ];
char s[N][N];
int n, m;
int p, q;
void creat_line(){
p = 1;
for(int i=0;i<n;i++){
bool f = 0;
for(int j=0;j<m;j++){
if(s[i][j] =='*'){
a[i][j] = p;
f = 1;
}
else if(s[i][j] == '#'){
if(j!=m-1)
p++;
f = 0;
}
}
p++;
}
}
void creat_col(){
q = 1;
for(int j=0;j<m;j++){
bool f = 0;
for(int i=0;i<n;i++){
if(s[i][j] =='*'){
b[i][j] = q;
f = 1;
}
else if(s[i][j] == '#'){
if(i!=n-1)
q++;
f = 0;
}
}
q++;
}
}
bool found(int x){
for(int i=1;i<q;i++){
if(!used[i] && linked[x][i]){
used[i] = 1;
if(match[i]==-1 || found(match[i])){
match[i] = x;
return 1;
}
}
}
return 0;
}
void init(){
ms(a);
ms(b);
ms(linked);
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
init();
scanf("%d%d", &n, &m);
for(int i=0;i<n;i++){
scanf("%s", s[i]);
}
creat_col();
creat_line();
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// printf("%d", a[i][j]);
// }
// printf("\n");
// }
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// printf("%d", b[i][j]);
// }
// printf("\n");
// }
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j] == '*'){
linked[a[i][j]][b[i][j]] = 1;
}
}
}
memset(match, -1, sizeof(match));
int ans = 0;
for(int i=1;i<p;i++){
ms(used);
if(found(i)) ans++;
}
printf("%d\n", ans);
}
return 0;
}