1.类似八皇后问题,但同行同列若有墙则可再放置,回溯+dfs
2.二分匹配问题,X部和Y部满足条件的交叉点即为所求
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
char map[5][5];
bool vis[5][5];
int n,ans=-1;
bool isok(int x,int y){
for(int i=x+1;map[i][y]!='X'&&i<n;i++)
if(vis[i][y]) return 0;
for(int j=y+1;map[x][j]!='X'&&j<n;j++)
if(vis[x][j]) return 0;
for(int i=x-1;map[i][y]!='X'&&i>=0;i--)
if(vis[i][y]) return 0;
for(int j=y-1;map[x][j]!='X'&&j>=0;j--)
if(vis[x][j]) return 0;
return 1;
}
void dfs(int x,int y){
if(x==n*n){
if(y>ans)
ans=y;
}
else{
int x1=x/n;
int y1=x%n;
if(map[x1][y1]=='.'&&!vis[x1][y1]&&isok(x1,y1)){
vis[x1][y1]=true;
dfs(x+1,y+1);
vis[x1][y1]=false;
}
dfs(x+1,y);
}
}
int main(){
while(~scanf("%d",&n)&&n){
memset(vis,0,sizeof(vis));
ans=-1;
for(int i=0;i<n;i++)
scanf("%s",map[i]);
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}