简单的深搜题
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int city[4][4];
int n,res;
//在(i,j)处放blockhouse是否合法
bool isLegal(int i,int j){
if(city[i][j]!=0) return false;
int k,m;
for(k=0;k<n;k++){
if(city[i][k]==2){
for(m=k+1;m<j;m++) if(city[i][m]==1)
{ k=m; break;}
if(m==j) return false;
}
}
for(k=0;k<n;k++){
if(city[k][j]==2){
for(m=k+1;m<i;m++) if(city[m][j]==1)
{ k=m; break;}
if(m==i) return false;
}
}
return true;
}
void dfs(int i,int j,int &count){
if(i==n){ res = max(res,count); return;}
if(isLegal(i,j)){
city[i][j]=2; count++;
int k;
for(k=j+1;k<n;k++) if(city[i][k]==1) break;
k++;
if(k==n) dfs(i+1,0,count);
else dfs(i,k,count);
city[i][j]=0; count--;
}
if(j==n-1) i++;
dfs(i,(j+1)%n,count);
}
int main(){
//freopen("input.txt","rb",stdin);
while(true){
scanf("%d\n",&n);
if(n==0) break;
char c;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
{
scanf("%c",&c);
if(c=='.') city[i][j] = 0;
else city[i][j]=1;
}
scanf("\n");
}
int count = 0;
res = 0;
dfs(0,0,count);
printf("%d\n",res);
}
return 0;
}