/*
hdu 1045
搜索题加贪心思想
对于找最大xx的题,要么用广搜,要么就把每个坐标都作为第一个点搜索一次
*/
#include <iostream>
#include <cstdio>
#define maxn 6
using namespace std;
int sum,n;
char map[maxn][maxn];
int find(int x,int y) //看该点是否能够放O
{
if(map[x][y]!='.')
return 0;
for(int i=x-1;i>=1;i--) //纵向检索是否不合题意
{
if(map[i][y]=='X')
break;
if(map[i][y]=='O')
return 0;
}
for(int i=y-1;i>=1;i--) //纵向检索
{
if(map[x][i]=='X')
break;
if(map[x][i]=='O')
return 0;
}
return 1;
}
int dfs(int p, int s)
{
if(p==n*n)
{
sum=sum>s?sum:s;
return 0;
}
int a=p/n+1; //求纵坐标
int b=p%n+1; //求横坐标
if(find(a,b))
{
map[a][b]='O';
dfs(p+1,s+1);
map[a][b]='.';
}
dfs(p+1,s);
return 0;
}
int main()
{
while(scanf("%d",&n),n!=0)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];
sum=-1;
dfs(0,0); //分别代表在检索第几个点和共放置多少个O;
printf("%d\n",sum);
}
}