package main

import (
	"bufio"
	"fmt"
    "os"
)

func main() {
    var n int 
    fmt.Scanf("%d", &n)
    var k = make([][]byte, n)
    var visit = make([][]bool, n)
    scanner := bufio.NewScanner(os.Stdin)
    for i:=0;i<n;i++{
        k[i]= make([]byte, n)
        visit[i]=make([]bool,n)
        scanner.Scan() // 读取一整行
        line := scanner.Text()
        for j:=0;j<n;j++{
            k[i][j] = line[j] // 直接fmt.Scanf("%c", &k[i][j])需注意避开行末的换行符
        }
    }

    var result int =0
    var submerge bool 
    dist := [][]int{{0,1},{0,-1},{1,0},{-1,0}}
    var dfs func(i, j int)
    dfs = func(i, j int){ // 遍历过程中如果不存在四边都是空地的,该区域会被淹没
        if submerge {
            var f1,f2,f3,f4 bool = true, true, true, true
            if i-1 >=0 {
                if k[i-1][j] !='#'{
                    f1 = false
                }
            }
            if i+1 <n {
                if k[i+1][j] !='#'{
                    f2 = false
                }
            }
            if j-1 >=0 {
                if k[i][j-1] !='#'{
                    f3 = false
                }
            }
            if j+1 <n {
                if k[i][j+1] !='#'{
                    f4 = false
                }
            }
            if f1 && f2 && f3 && f4 {
                submerge = false
            }
        }
        for _,v:=range dist{
            ni := i+v[0]
            nj := j+v[1] 
            if ni<0|| ni>=n||nj<0||nj>=n || visit[ni][nj] || k[ni][nj] == '.'{
                continue
            }
            visit[ni][nj] = true
            dfs(ni,nj)
        }
    }
    
    for i:=0;i<n;i++{
        for j:=0;j<n;j++{
            if visit[i][j] == false && k[i][j]=='#' {
                submerge = true // 先假设该联通分量区域会被全部淹没
                visit[i][j] =true
                dfs(i,j)
                if submerge {
                    result++
                }
            }
        }
    }
    fmt.Println(result)
}