#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define N 45
#define M N*N
int H,W,k,tot,ans,cnt;
int head[M],Next[M],ver[M];
int match[M],vis[M],v[N][N];
bool flag[M];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x],head[x]=tot;
}
char c[N][N];
bool dfs(int x){
for(int i=head[x],y;i;i=Next[i])
if(!vis[y=ver[i]]){
vis[y]=1;
if(!match[y]||dfs(match[y])){
match[y]=x;
return true;
}
}
return false;
}//匈牙利板子
void init(){
ans=tot=cnt=0;
memset(head,0,sizeof(head));
memset(flag,0,sizeof(flag));
memset(v,0,sizeof(v));
memset(match,0,sizeof(match));
}//极其重要的清零
int t;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&H,&W);
init();
for(int i=1;i<=H;++i)
for(int j=1;j<=W;++j){
scanf(" %c",&c[i][j]);
if(c[i][j]=='*') {
v[i][j]=++cnt;
if((i+j)&1) flag[cnt]=1; //将黑色的点区别出来
}
}
for(int i=1;i<=H;++i)
for(int j=1;j<=W;++j)
if(v[i][j]){
for(int k=0;k<4;++k){
int x=i+dx[k],y=j+dy[k];
if(v[x][y]) add(v[i][j],v[x][y]);
}//四个方向都要看
}
for(int i=1;i<=cnt;++i){
if(!flag[i]) continue;
memset(vis,0,sizeof(vis));
if(dfs(i)) ++ans;
}
printf("%d\n",cnt-ans);
}
return 0;
}