题目:http://poj.org/problem?id=1315
题意:X是墙,可以挡着防止相互攻击
/*
step++,x=step/n,y=step%n一行一行的搜,搜到可行的位置,不用标记false,往上和往左找就行,
再一行一行的搜,不行就回溯,直到第一行找完
其实第一颗棋子试到了第二行就完事了,不过为了好写都找了吧
*/
#include<iostream>
#include<string.h>
using namespace std;
bool mp[5][5],vis[5][5];
int n,ans;
int ok(int x,int y){
int xx=x,yy=y;
if(mp[x][y]) return 0;
while(!mp[xx][y]){
xx--; if(xx==-1) break;
if(vis[xx][y])
return 0;
}
while(!mp[x][yy]){
yy--; if(yy==-1) break;
if(vis[x][yy])
return 0;
}
return 1;
}
void dfs(int step,int cnt){ //第一枚棋子的放置位置
ans=max(ans,cnt);
for(int i=step;i<n*n;i++){
int x=i/n;
int y=i%n;
if(ok(x,y)){
vis[x][y]=1; //放上棋子
dfs(i+1,cnt+1);
vis[x][y]=0;
}
}
}
int main(){
char tmp;
while(scanf("%d",&n)&&n){
ans=0;
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
cin>>tmp;
if(tmp=='X')
mp[i][j]=1;
}
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}