#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char da[108][108];
int hs[108][108];
int ans;//全局变量记录放车数量的最大值。
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n;
void update(int x,int y,int val)
{
for(int i=0;i<4;i++)//上下左右四个方向都不能放棋子
{
int tx=x;
int ty=y;
while(1)
{
if(tx<0 || tx>n || ty<0 || ty>n)
{
break;
}
if(da[tx][ty]!='.')
break;
hs[tx][ty]=hs[tx][ty]+val;
tx=tx+dx[i];
ty=ty+dy[i];
}
}
}
void dfs(int x,int y,int num)
{
if(y==n)//如果找到最底端,就换一列,从第一个开始找。
{
x++;
y=0;
}
if(x==n)//全部找完之后找num(已找到个数)(理论值)与每行每列至少有一个哪一个多?
{
ans=max(ans,num);
return ;
}
if(da[x][y]=='.'&& hs[x][y]==0)//说明已经找到一个
{
{
update(x,y,1);//该点上下左右列所有点都附成1说明已经不能放车了
dfs(x,y+1,num+1);//理论值变大1个寻找到底。
//找到这种情况的可放车的个数
}
update(x,y,-1);//回溯
}//换一种情况
dfs(x,y+1,num);//找下一个点
}
int main()
{
int i;
while(1)
{
cin>>n;
if(n==0)
break;
memset(hs,0,sizeof(hs));
for(i=0;i<n;i++)
cin>>da[i];
ans=0;
dfs(0,0,0);
cout<<ans<<endl;
}
return 0;
}