题目
Sample Input
4
. X . .
. . . .
X X. .
. . . .
2
XX
. X
3
. X .
X.X
. X .
3
. . .
.XX
.XX
4
. . . .
. . . .
. . . .
. . . .
0
Sample Output
5
1
5
2
4
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
int n,mp[5][5],maxx,cnt,xn,yn;
int ok(int x,int y){
if(mp[x][y]!=1)return 0;
xn=x,yn=y;
while(mp[xn+1][y]&&xn+1<n)if(mp[++xn][y]==2)return 0;
xn=x,yn=y;
while(mp[xn-1][y]&&xn-1>=0)if(mp[--xn][y]==2)return 0;
xn=x,yn=y;
while(mp[x][yn-1]&&yn-1>=0)if(mp[x][--yn]==2)return 0;
xn=x,yn=y;
while(mp[x][yn+1]&&yn+1<n)if(mp[x][++yn]==2)return 0;
return 1;
}
void dfs(){
if(cnt>8)return;
maxx=max(maxx,cnt);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(ok(i,j)){
mp[i][j]=2;
++cnt;
dfs();
mp[i][j]=1;
--cnt;
}
}
int main(){
while(n=read()){
maxx=cnt=0;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j){
char t; cin>>t;
if(t=='.')mp[i][j]=1;
else mp[i][j]=0;
}
dfs();
printf("%d\n",maxx);
}
return 0;
}