简单的回溯+DFS
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define MAX_SIZE 500
char maps[MAX_SIZE][MAX_SIZE];
int visa[MAX_SIZE][MAX_SIZE];
/*标记一个点是否遍历过*/
int maxs;
int n;
void dfs(int u,int number,int w,int p)/*代表在第u行,目前放了number个棋子*/
{
maxs=maxs>number?maxs:number;
if(u>=n) return ;
int ok1 = p;/*ok代表这一行能遍历的状态*/
int i,k;
for(i=w;i<n;i++){
if(ok1&&maps[u][i]=='.'){
for(k=u-1;k>=0;k--) /*判断在不在一条线上*/{
if(visa[k][i]) break;
else if(maps[k][i]=='X') {k=-1;break;}
}
/*如果这个点之前有走过了,跳出循环*/
if(k<0){
number++;
visa[u][i]=1;
ok1=0;
dfs(u+1,number,0,1);
/*去下一层遍历*/
dfs(u,number,i+1,ok1);
/*回到本层继续遍历*/
number--;
ok1=1;
visa[u][i]=0;
}
}
if(maps[u][i]=='X') ok1=1;
}
dfs(u+1,number,0,1);
}
int main()
{
while(scanf("%d",&n)&&n){
memset(maps,0,sizeof(maps));
memset(visa,0,sizeof(visa));
for(int i=0;i<n;i++)
scanf("%s",maps[i]);
/*获得了一个棋盘*/
maxs=0;
dfs(0,0,0,1);
printf("%d\n",maxs);
}
return 0;
}