最近在做深搜,从基础开始复习,据说这道题是挺经典的深搜。
1 #include<iostream>
2 using namespace std;
3 bool map[5][5];
4 bool visit[5][5];
5 int cnt,best,n;
6 bool check(int x,int y)
7 {
8 int i,j;
9 for(i=y;i<=n;i++)
10 {
11 if(map[x][i]==1)
12 {
13 break;
14 }
15 if(visit[x][i])
16 return 0;
17 }
18 for(i=y;i>=1;i--)
19 {
20 if(map[x][i]==1)
21 {
22 break;
23 }
24 if(visit[x][i])
25 return 0;
26 }
27 for(j=x;j>=1;j--)
28 {
29 if(map[j][y]==1)
30 break;
31 if(visit[j][y])
32 return 0;
33 }
34 for(j=x;j<=n;j++)
35 {
36 if(map[j][y]==1)
37 break;
38 if(visit[j][y])
39 return 0;
40 }
41 return 1;
42 }
43 bool ok(int x,int y)
44 {
45 if(x>=1&&x<=n&&y>=1&&y<=n&&map[x][y]==0&&!visit[x][y]&&check(x,y))
46 {
47 return 1;
48 }
49 return 0;
50 }
51 int dfs(int r,int c)
52 {
53 if(c>n)
54 {
55 dfs(r+1,1);
56 return 0;
57 }
58 if(r>n)
59 {
60 if(cnt>best)
61 best=cnt;
62 return 0;
63 }
64 int i,j;
65 if(ok(r,c))
66 {
67 visit[r][c]=1;
68 cnt++;
69 dfs(r,c+1);
70 visit[r][c]=0;
71 cnt--;
72 }
73 dfs(r,c+1);
74 return 0;
75 }
76 int main()
77 {
78 char s;
79 while(scanf("%d",&n)&&n!=0)
80 {
81 memset(map,0,sizeof(map));
82 memset(visit,0,sizeof(visit));
83 getchar();
84 int i,j;
85 for(i=1;i<=n;i++)
86 {
87 for(j=1;j<=n;j++)
88 {
89 scanf("%c",&s);
90 if(s=='X')
91 map[i][j]=1;
92 else
93 map[i][j]=0;
94 }
95 getchar();
96 }
97 cnt=0;
98 best=0;
99 dfs(1,1);
100 printf("%d\n",best);
101 }
102 system("pause");
103 return 0;
104 }
105
106