#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
const int MAXSIZE = 42;
int road[MAXSIZE][MAXSIZE];
int visit[500];
int res[500];
int m, n;
int ix[500][500];
int cnt;
int direction[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1,0}};
bool find(int x){
for (int i = 1; i <=cnt ; ++i) {
if (ix[x][i]&&!visit[i]){
visit[i] = 1;
if (!res[i]||find(res[i])){
res[i] = x;
return true;
}
}
}
return false;
}
int main(){
// freopen("../in.txt", "r", stdin);
int testcase;
scanf("%d", &testcase);
while (testcase--){
memset(ix, 0, sizeof(ix));
memset(road, 0, sizeof(road));
memset(res, 0, sizeof(res));
cnt = 0;
scanf("%d %d", &m, &n);
for (int i = 1; i <=m ; ++i) {
for (int j = 1; j <=n ; ++j) {
char a;
cin>>a;
if (a == '*'){
cnt++;
road[i][j] = cnt;
}
}
}
// 数据输入完成
for (int i = 1; i <=m ; ++i) {
for (int j = 1; j <=n ; ++j) {
if (!road[i][j]) continue;
// 从四个角度产看
for (int k = 0; k < 4; ++k) {
int xx = i+direction[k][0];
int yy = j+direction[k][1];
if (road[xx][yy]){
// 说明是相邻的
ix[road[i][j]][road[xx][yy]] = ix[road[xx][yy]][road[i][j]] = 1;
}
}
}
}
// 二分图构造完成
int ans = 0;
for (int i = 1; i <=cnt ; ++i) {
memset(visit, 0, sizeof(visit));
if (find(i))
ans++;
}
cout<<cnt-ans/2<<endl;
}
}
POJ 3020
最新推荐文章于 2022-05-28 19:12:25 发布