题目的数据量比较小,直接暴力搜索就可以过。
C++代码:
#include<stdio.h>
int n,maxnum=0;
char map[5][5];
bool check(int row,int col){
int i,j;
for(i=row;i>=0;i--){
if(map[i][col]=='O')return false;
if(map[i][col]=='X')break;
}
for(j=col;j>=0;j--){
if(map[row][j]=='O')return false;
if(map[row][j]=='X')break;
}
return true;
}
void dfs(int i,int num){
int row,col;
if(i==n*n){
if(num>maxnum)
maxnum=num;
return;
}
else{
row=i/n;col=i%n;
if(map[row][col]=='.'&&check(row,col)){
map[row][col]='O';
dfs(i+1,num+1);
map[row][col]='.';
}
dfs(i+1,num);
}
}
int main(){
//freopen("1.txt","r",stdin);
while(scanf("%d",&n)!=EOF&&n){
maxnum=0;
for(int i=0;i<n;i++)
scanf("%s",&map[i]);
dfs(0,0);
printf("%d\n",maxnum);
}
return 0;
}