#include<iostream>
using namespace std;
inline int max(int a,int b)
{
if(a>=b) return a; else return b;
}
inline int min(int a,int b)
{
if(a<=b) return a; else return b;
}
int board[4][4];
typedef struct point{
int x;
int y;
}point;
point house[16];
int n;
int max_house;
int cur_house;
void init()
{
cur_house=max_house=0;
}
int check(int r,int c)
{
int i,j;
bool flag;
for(i=0;i<cur_house;i++)
{
flag=true;
if(house[i].x==r)
{
flag=false;
for(j=min(house[i].y,c); j<=max(house[i].y,c); j++)
{
if(board[r][j]==1)
flag=true;
}
}
else if(house[i].y==c)
{
flag=false;
for(j=min(house[i].x,r); j<=max(house[i].x,r); j++)
{
if(board[j][c]==1)
flag=true;
}
}
if(flag==false)
{
return 0;
}
}
return 1;
}
void dfs(int level)
{
if(level>=n*n)
{
if(cur_house>max_house)
max_house=cur_house;
return;
}
if(board[level/n][level%n]==1)
{
dfs(level+1);
}
else
{
if( check(level/n,level%n)==1 )//检查这一格是否能放房子
{
house[cur_house].x=level/n;
house[cur_house].y=level%n;
cur_house++;
dfs(level+1);
cur_house--;
}
if(cur_house+(n*n-(level+1)) > max_house )
dfs(level+1);
}
}
int main()
{
char ch;
cin>>n;
while(n!=0)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>ch;
if(ch=='X')
board[i][j]=1;
else board[i][j]=0;
}
init();
dfs(0);
cout<<max_house<<endl;
cin>>n;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
using namespace std;
inline int max(int a,int b)
{
if(a>=b) return a; else return b;
}
inline int min(int a,int b)
{
if(a<=b) return a; else return b;
}
int board[4][4];
typedef struct point{
int x;
int y;
}point;
point house[16];
int path[16];
int n;
int max_house;
int cur_house;
void init()
{
cur_house=max_house=0;
}
int check(int r,int c)
{
int i,j;
bool flag;
for(i=0;i<cur_house;i++)
{
flag=true;
if(house[i].x==r)
{
flag=false;
for(j=min(house[i].y,c); j<=max(house[i].y,c); j++)
{
if(board[r][j]==1)
flag=true;
}
}
else if(house[i].y==c)
{
flag=false;
for(j=min(house[i].x,r); j<=max(house[i].x,r); j++)
{
if(board[j][c]==1)
flag=true;
}
}
if(flag==false)
{
return 0;
}
}
return 1;
}
void trackback()
{
int level=0;
while(true)
{
while(board[level/n][level%n]==0 && level<n*n && check(level/n,level%n)==1)
{
house[cur_house].x=level/n;
house[cur_house].y=level%n;
cur_house++;
path[level]=1;
level++;
}
if(level>=n*n)
{
if(cur_house>max_house)
{
max_house=cur_house;
}
}
else
{
path[level]=0;
level++;
}
while(cur_house+(n*n-level)<=max_house)
{
level--;
while(level>=0 && path[level]==0)
{
level--;
}
if(level<0)
return ;
else
{
cur_house--;
path[level]=0;
level++;
}
}
}
}
int main()
{
char ch;
cin>>n;
while(n!=0)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>ch;
if(ch=='X')
board[i][j]=1;
else board[i][j]=0;
}
init();
trackback();
cout<<max_house<<endl;
cin>>n;
}
return 0;
}