堡垒问题
![img](https://i-blog.csdnimg.cn/blog_migrate/a160e8539aa95f1b290574f857c8b3b1.png)
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=20+5;
int n,vis[maxn][maxn],ans;char a[maxn][maxn];
int max(int x,int y){
if(x>=y)return x;
return y;
}
void dfs(int now,int cnt){
if(now==n*n){
ans=max(ans,cnt);
return ;
}
int r=now/n,c=now%n,i;
if(a[r][c]!='X'&&vis[r][c]==0){
vis[r][c]=1;
for(i=r+1;i<=n;i++){
if(a[i][c]!='X')vis[i][c]=1;
else break;
}
for(i=c+1;i<=n;i++){
if(a[r][i]!='X')vis[r][i]=1;
else break;
}
dfs(now+1,cnt+1);
vis[r][c]=0;
for(i=r+1;i<=n;i++){
if(a[i][c]!='X')vis[i][c]=0;
else break;
}
for(i=c+1;i<=n;i++){
if(a[r][i]!='X')vis[r][i]=0;
else break;
}
}
dfs(now+1,cnt);
}
int main(){
int i,j;
while(1){
cin>>n;
if(n==0)break;
ans=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
cin>>a[i][j];
}
}
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}