加‘0 ’从(0,0)到(n-1,n-1) 判断能不能放倒着搜索 比如 0 *0*0 是可以放的
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <stack>
#include <map>
#include <math.h>
#include <queue>
using namespace std;
int n,maxnum;
char grid[4][4];
int canput(int x,int y){ //倒着搜索
int i;
for(i=x-1;i>=0;i--){
if(grid[i][y]=='0')
return 0;
if(grid[i][y]=='X')
break;
}
for(i=y-1;i>=0;i--){
if(grid[x][i]=='0')
return 0;
if(grid[x][i]=='X')
break;
}
return 1;
}
void dfs(int k,int num){
int x,y;
if(k==n*n){
if(num>maxnum){
maxnum=num;
return ;
}
}
else{
x=k/n;
y=k%n;
if(grid[x][y]=='.'&&canput(x,y)){
grid[x][y]='0';
dfs(k+1,num+1);
grid[x][y]='.'; //回溯
}
dfs(k+1,num);
}
}
int main(){
int i,j;
while(cin>>n&&n){
maxnum=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>grid[i][j];
dfs(0,0);
cout<<maxnum<<endl;
}
}