package main
/*
先把边界为'0'的地方都BFS标记一次(会被淹没的'0')
然后再次BFS_未被标记的'0',计算安全的'0'的个数
*/
import (
"fmt"
)
type Node struct{
i,j int
}
func main() {
var n,m int
fmt.Scanf("%d %d",&n, &m)
var k = make([][]byte, n)
var v = make([][]bool, n)
var s string
for i:=0;i<n;i++{
k[i] = make([]byte, m)
v[i] = make([]bool, m)
fmt.Scanf("%s", &s)
k[i] = []byte(s)
}
dist:= [][]int{{0,1}, {0,-1}, {1,0}, {-1,0}}
var cur Node
var queue []Node
var result, ni, nj int
var BFS func(i, j int)
BFS = func(i, j int){ // 标记会被淹没的'0'
queue = []Node{{i,j}}
for len(queue) > 0{
cur = queue[0]
queue = queue[1:]
for _, d := range dist{
ni = cur.i + d[0]
nj = cur.j + d[1]
if ni<0 || ni>=n || nj<0 || nj>=m || v[ni][nj] || k[ni][nj] == '*'{
continue
}
v[ni][nj] = true
queue = append(queue, Node{ni,nj})
}
}
}
var BFS_ func(i, j int) // 累计安全的'0'的个数
BFS_ = func(i, j int){
queue = []Node{{i,j}}
for len(queue) > 0{
cur = queue[0]
queue = queue[1:]
for _, d := range dist{
ni = cur.i + d[0]
nj = cur.j + d[1]
if ni<0 || ni>=n || nj<0 || nj>=m || v[ni][nj] || k[ni][nj] == '*'{
continue
}
v[ni][nj] = true
result++
queue = append(queue, Node{ni,nj})
}
}
}
// 标记会被淹没的区域
for i:=0;i<n;i++{
if k[i][0] == '0' && !v[i][0] {
v[i][0] = true
BFS(i,0)
}
if k[i][m-1] == '0' && !v[i][m-1]{
v[i][m-1] = true
BFS(i,m-1)
}
}
for i:=0;i<m;i++{
if k[0][i] == '0' && !v[0][i] {
v[0][i] = true
BFS(0,i)
}
if k[n-1][i] == '0' && !v[n-1][i]{
v[n-1][i] = true
BFS(n-1,i)
}
}
for i:=0;i<n;i++{
for j:=0;j<m;j++{
if k[i][j] == '0' && !v[i][j]{
v[i][j] = true
result++
BFS_(i,j)
}
}
}
fmt.Print(result)
}