回溯法:在递归的构建中,生成和检查过程就可以有机的结合起来,从而减少不必要的枚举
排列枚举的两种方式
void dfs(int index)
{
if(index = 9)
{
Solve();
return;
}
for(int i=1;i<10;i++)
{
if(!visit[i])
{
visit[i] = true;
a[index] = i;
dfs(index+1);
visit[i] = false;
}
}
}
另外一种
void dfs(int n,int *A,int cur)
{
int i,j;
if(cur == n){
Solve();
return;
}
for(i=1;i<=n;i++)
{
int ok = 1;
for(j=0;j<cur;j++)
if(A[j] == i)
ok = 0;
if(ok)
{
A[cur] = i;
print_permutation(n,A,cur+1);
}
}
}
递归的经典问题:
八皇后问题:经过思考,不难发现以下事实,恰好每行每列个放置一个皇后,如果用C[x]表示皇后的编号,则问题变成了全排列的生成问题,而我们知道,0~7的排列一共只有8!次,所以我们的枚举量并不会超过他