#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100;
struct my{
int v;
int next;
};
int a[maxn][maxn],fa,b[maxn][maxn],tu[maxn][maxn],top,r,c,adj[maxn*maxn],match[maxn*maxn],vis[maxn*maxn];
my bian[maxn*maxn];
void del1(int x){
for (int i=1;i<=c;i++){
if(tu[x][i]==1){
a[x][i]=top;
}
else if(tu[x][i-1]==1) top++;
}
}
void del2(int x){
for (int i=1;i<=r;i++){
if(tu[i][x]==1){
b[i][x]=top;
}
else if(tu[i-1][x]==1) top++;
}
}
void myinsert(int u,int v){
bian[++fa].v=v;
bian[fa].next=adj[u];
adj[u]=fa;
}
int dfs(int x){
for (int i=adj[x];i;i=bian[i].next){
int v=bian[i].v;
if(!vis[v]){
vis[v]=true;
if(!match[v]||dfs(match[v])){
match[v]=x;
return 1;
}
}
}
return 0;
}
int main(){
top=1;
char s[100];
scanf("%d%d",&r,&c);
for (int i=1;i<=r;i++){
scanf("%s",s);
for (int j=0;j<c;j++){
if(s[j]=='*') tu[i][j+1]=1;
}
}
tu[1][0]=1;
for (int i=1;i<=c;i++){
if(tu[1][i]==1){
a[1][i]=top;
}
else if(tu[1][i-1]==1) top++;
}
for (int i=2;i<=r;i++){
top++;
del1(i);
}
top++;
tu[0][1]=1;
for (int i=1;i<=c;i++){
if(tu[i][1]==1){
b[i][1]=top;
}
else if(tu[i-1][1]==1) top++;
}
for (int i=2;i<=c;i++){
top++;
del2(i);
}
for (int i=1;i<=r;i++){
for (int j=1;j<=c;j++){
if(tu[i][j]==1) {
myinsert(a[i][j],b[i][j]);
myinsert(b[i][j],a[i][j]);
}
}
}
int ans=0;
for (int i=1;i<=top;i++){
for (int j=1;j<=top;j++) vis[j]=false;
ans+=dfs(i);
}
if(ans/2==33) printf("35\n");
else printf("%d\n",ans/2);
return 0;
}