搜索算法:深度优先搜索(DFS)
关于深搜的介绍,在网上有很多,不再赘述。主要以题目形式实例讲解。
POJ - 1321 (http://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 }