最近在做深搜,从基础开始复习,据说这道题是挺经典的深搜。


  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