#include <iostream>
#include <queue>
#define maxsize 1000
using namespace std;
//判断传入的连通块是否是矩形,传入外接最小矩形四个顶点,检测矩形中是否有值为1(表示*)的点即可
int check(int max_i, int max_j, int min_i, int min_j, int v[maxsize][maxsize]){
for(int i = min_i; i <= max_i; i++){
for(int j = min_j; j <= max_j; j++){
if(v[i][j] == 1){
return 0;
}
}
}
return 1;
}
int main() {
//输入数据
int n, m;
cin >> n >> m;
int v[maxsize][maxsize];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
char tmp;
cin >> tmp;
if(tmp == '*'){
v[i][j] = 1;
}
else{
v[i][j] = 0;
}
}
}
int count = 0;//结果计数
//对每一个0点找出所在的连通图(bfs)的最小外接矩形的四个顶点并标记访问,再判断连通图是否为长方形
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(v[i][j] == 0){
v[i][j] = 2;
//四个顶点
int min_i = i;
int max_i = i;
int min_j = j;
int max_j = j;
//遍历邻接点,bfs
queue<pair<int,int>> q;
q.push({i, j});
int a[4] = {-1, 0, 0, 1};
int b[4] = {0, -1, 1, 0};
while(!q.empty()){
pair<int, int> current = q.front();
q.pop();
for(int k = 0; k < 4; k++){
int ti = current.first + a[k];
int tj = current.second + b[k];
if(ti >= 0 && ti < n && tj >= 0 && tj < m && v[ti][tj] == 0){
//是0标记,入队列并更新4个顶点的值
v[ti][tj] = 2;
q.push({ti, tj});
max_i = max(max_i, ti);
max_j = max(max_j, tj);
min_i = min(min_i, ti);
min_j = min(min_j, tj);
}
}
}
if(check(max_i, max_j, min_i, min_j, v)){
count++;
}
}
}
}
cout << count << endl;
return 0;
}