搜索算法:深度优先搜索(DFS)

  关于深搜的介绍,在网上有很多,不再赘述。主要以题目形式实例讲解。

  POJ - 1321http://poj.org/problem?id=1321

  题目大意:给出一个棋盘,棋子不能同行同列,求放棋子的可行方案数。

  题目思路:给的数据非常小,n<=8,非常简单的一道深搜题。需要放k行,按行递增递归,找到行中可以放的点,然后往下搜,直到把棋子放完,方案数就加一。只要设置一个col[]数组保存已经放过的列,找到一个点,col[i]置为1,返回上一层是col[i]置回0。

  代码:(http://paste.ubuntu.com/17087895/

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int col[10],n,k,ans;
 5 char a[10][10];
 6 void dfs(int row,int num)
 7 {    
 8     for(int i=0;i<n;i++)
 9     {
10         if(a[row][i]=='#' && !col[i])
11         {
12             if(num == 1)
13                 ans++;
14             else
15             {
16                 col[i] = 1;
17                 for(int j=row+1;j<n-num+2;j++)
18                     dfs(j,num-1);
19                 col[i] = 0;
20             }
21         }
22     }
23 }
24 int main()
25 {
26     int i,j;
27     while(cin>>n>>k && n>0 && k>0)
28     {
29         for(i=0;i<n;i++)
30             for(j=0;j<n;j++)
31                 cin>>a[i][j];
32         memset(col,0,sizeof(col));
33         ans = 0;
34         for(i=0;i<n-k+1;i++)
35             dfs(i,k);
36         cout<<ans<<endl;
37     }
38 }

 

posted on 2016-06-07 20:58  Alinshans  阅读(624)  评论(0编辑  收藏  举报