http://acm.hdu.edu.cn/showproblem.php?pid=1045
#include <bits/stdc++.h>
using namespace std;
char mp[5][5];
int n,maxn;
bool ok(int x,int y){
if(mp[x][y]=='x'||mp[x][y]=='X')
return false;
for(int i=y;i<=n;i++){
if(mp[x][i]=='x')
return false;
if(mp[x][i]=='X')
break;
}
for(int i=y;i>=1;i--){
if(mp[x][i]=='x')
return false;
if(mp[x][i]=='X')
break;
}
for(int i=x;i<=n;i++){
if(mp[i][y]=='x')
return false;
if(mp[i][y]=='X')
break;
}
for(int i=x;i>=1;i--){
if(mp[i][y]=='x')
return false;
if(mp[i][y]=='X')
break;
}
return 1;
}
void dfs(int c_x,int c_y,int c_n){
int dx=0;
int dy=0;
if(maxn<c_n) maxn=c_n;
for(int i=c_x;i<=n;i++){
for(int j=1;j<=n;j++){//在该位之后找
if(i==c_x&&j<=c_y)
continue;
if(!ok(i,j)) continue;//判断该点是否能放
dx=i; dy=j;
mp[i][j]='x';
dfs(dx,dy,c_n+1);
mp[i][j]='.';
}
}
if(dx==0&&dy==0) return ;//找不到新的可放位置结束
}
int main(){
while(cin>>n&&n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cin>>mp[i][j];
}
maxn=-1;
dfs(1,0,0);
cout<<maxn<<endl;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<mp[i][j]<<' ';
cout<<endl;
}*/
}
}