#include <iostream>
#include <fstream>
#include <string>
using namespace std;
char a[5][5];
int n;
int sum;
string cinString;
inline void rg(int &a, int &b)
{
a=(a>=b?a:b);
}
bool PathCut(int row, int col)
{
int i,j;
for(i=row-1;i>=1;i--)
{
if(a[i][col]=='.')
continue;
else if(a[i][col]=='X')
break;
else if(a[i][col]=='o')
return false;
}
for(i=row+1;i<=n;i++)
{
if(a[i][col]=='.')
continue;
else if(a[i][col]=='X')
break;
else if(a[i][col]=='o')
return false;
}
for(j=col-1;j>=1;j--)
{
if(a[row][j]=='.')
continue;
else if(a[row][j]=='X')
break;
else if(a[row][j]=='o')
return false;
}
for(j=col+1;j<=n;j++)
{
if(a[row][j]=='.')
continue;
else if(a[row][j]=='X')
break;
else if(a[row][j]=='o')
return false;
}
return true;
}
inline int modn(int num)
{
if(num%n)
return num%n;
else
return n;
}
inline int chun(int num)
{
return (num+n-1)/n;
}
void solve(int k, int number)
{
if(k==n*n)
{
rg(sum, number);
return;
}
//else
int tempK=k+1;
int row=chun(tempK);
int col=modn(tempK);
if(a[row][col]=='.' && PathCut(row,col))
{
a[row][col]='o';
solve(k+1, number+1);
//回溯
a[row][col]='.';
}
solve(k+1, number);
}
int main()
{
ifstream cin("1.txt");
int i,j;
while(cin>>n && n)
{
sum=0;
//memset(a,0,sizeof(a))
for(i=1;i<=n;i++)
{
//cin>>cinString;
for(j=1;j<=n;j++)
{
//a[i][j]=cinString[j-1];
cin>>a[i][j];
}
}
solve(0, 0);
cout<<sum<<endl;
}
}