1、题目比较新鲜的地方就是有个墙,其实和八皇后没啥区别。用回溯法,要分放与不放两种情况讨论。
#include<cstdio>
using namespace std;
int n,ans,max;
char s[6][6];
bool is_valid(int x,int y){
bool flag=true;
if(s[x][y]=='X') flag=false;
else{
for(int i=n-1;i>=0;i--){
if(s[x][i]=='o'){flag=false;break;}
if(s[x][i]=='X') break;
}
for(int i=n-1;i>=0;i--){
if(s[i][y]=='o'){flag=false;break;}
if(s[i][y]=='X') break;
}
}
if(flag) return true;
else return false;
}
void dfs(int x,int y){
if(x==n&&y==n){
bool flag=false;
if(is_valid(x,y)){
ans++;
flag=true;
}
if(ans>max) max=ans;
if(flag) ans--;
return;
}else{
if(is_valid(x,y)){
s[x][y]='o';
ans++;
if(y+1<=n)
dfs(x,y+1);
else
dfs(x+1,1);
ans--;
s[x][y]='.';
}
if(y+1<=n)
dfs(x,y+1);
else
dfs(x+1,1);
}
return;
}
int main(){
//freopen("a.txt","r",stdin);
while(scanf("%d",&n)==1&&n){
ans=0;max=0;
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
s[i][0]='X';
}
for(int j=0;j<=n;j++)
s[0][j]='X';
dfs(1,1);
printf("%d\n",max);
}
return 0;
}