原问题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
#include <iostream>
#include <iomanip>
using namespace std;
bool islegal(char **map, const int row, const int col,const int n){
if(map[row][col]=='X'||map[row][col]=='o'){
return false;
}
int i=0;
//像四面搜索 左 右 上 下
for(i=(col-1);i>=0;i--){
if(map[row][i]=='X') break;
if(map[row][i]=='o') return false;
}
for(i=(col+1);i<n;i++){
if(map[row][i]=='X') break;
if(map[row][i]=='o') return false;
}
for(i=(row-1);i>=0;i--){
if(map[i][col]=='X') break;
if(map[i][col]=='o') return false;
}
for(i=(row+1);i<n;i++){
if(map[i][col]=='X') break;
if(map[i][col]=='o') return false;
}
return true;
}
int maxnum=0;
void DFS(int x, int n, char **map,int count){
if(x==n*n){
maxnum=(maxnum>count)?maxnum:count;
return;
}
int row=x/n;
int col=x%n;
if(islegal(map,row,col,n)){
map[row][col]='o';
DFS(x+1,n,map,count+1);
map[row][col]='.';
DFS(x+1,n,map,count);
}
else{
DFS(x+1,n,map,count);
}
}
int main(){
int n;
int i=0,j=0;
while(cin>>n && n){
char ** map = new char*[n];
for(i=0;i<n;i++){
map[i] = new char[n];
for(j=0;j<n;j++) cin>>map[i][j];
}
DFS(0,n,map,0);
cout<<maxnum<<endl;
maxnum=0;
}
}