关于深搜的介绍,在网上有很多,不再赘述。主要以题目形式实例讲解。
POJ - 1321 (http://poj.org/problem?id=1321)
题目大意:给出一个棋盘,棋子不能同行同列,求放棋子的可行方案数。
题目思路:给的数据非常小,n<=8,非常简单的一道深搜题。需要放k行,按行递增递归,找到行中可以放的点,然后往下搜,直到把棋子放完,方案数就加一。只要设置一个col[]数组保存已经放过的列,找到一个点,col[i]置为1,返回上一层是col[i]置回0。
代码:(http://paste.ubuntu.com/17087895/)
#include <iostream>
#include <cstring>
using namespace std;
int col[],n,k,ans;
char a[][];
void dfs(int row,int num)
{
for(int i=;i<n;i++)
{
if(a[row][i]=='#' && !col[i])
{
if(num == )
ans++;
else
{
col[i] = ;
for(int j=row+;j<n-num+;j++)
dfs(j,num-);
col[i] = ;
}
}
}
}
int main()
{
int i,j;
while(cin>>n>>k && n> && k>)
{
for(i=;i<n;i++)
for(j=;j<n;j++)
cin>>a[i][j];
memset(col,,sizeof(col));
ans = ;
for(i=;i<n-k+;i++)
dfs(i,k);
cout<<ans<<endl;
}
}