http://acm.hdu.edu.cn/showproblem.php?pid=1045
DFS

1 #include <stdio.h>
2 const int N=5;
3 char maze[N][N];
4 int vis[N][N];
5 int n,ans;
6 int ok(int x,int y)
7 {
8 if (maze[x][y]=='X') return 0;
9 int i;
10 for (i=x+1;i<n && maze[i][y]!='X';i++)
11 if (vis[i][y]) return 0;
12 for (i=x-1;i>=0 && maze[i][y]!='X';i--)
13 if (vis[i][y]) return 0;
14 for (i=y+1;i<n && maze[x][i]!='X';i++)
15 if (vis[x][i]) return 0;
16 for (i=y-1;i>=0 && maze[x][i]!='X';i--)
17 if (vis[x][i]) return 0;
18 return 1;
19 }
20 void dfs(int p,int s)
21 {
22 if (p==n*n)
23 {
24 if (s>ans) ans=s;
25 return;
26 }
27 int x=p/n,y=p%n;
28 dfs(p+1,s);
29 vis[x][y]=1;
30 if (ok(x,y)) dfs(p+1,s+1);
31 vis[x][y]=0;
32 }
33 int main()
34 {
35 int i;
36 while (scanf("%d",&n),n)
37 {
38 ans=0;
39 for (i=0;i<n;i++) scanf("%s",maze[i]);
40 dfs(0,0);
41 printf("%d\n",ans);
42 }
43 return 0;
44 }