#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 "); else printf("%d ",ans/2); return 0; }