( 啊哈!算法 的摘记)
DFS深度优先搜索的基本模型:
void dfs(int step)
{
判断边界
尝试每一种可能 for(i=1;i<=n;i++)
{
继续下一步 dfs(step+1)
}
返回
}
具体联系可见下实例:
需要将3张编号为1,2,3的扑克分别放到编号为1,2,3的3个盒子里面,并且每个盒子有且只能放一张牌,那么有多少种放法?
#include<stdio.h>
int n,a[10],book[10]; // a数组是盒子的代号,book是对扑克的代号,n是盒子或扑克的总数
void dfs(int step)//step 表示当前在第几个位置
{
int i;
if(step == n+1) //表示前n个盒子已经放好了扑克 因此可以打印出本次的情况
{
for(i=1; i<=n; i++)
printf("%d",a[i])
printf("\n");
return;
}
for(i=1; i<=n; i++)
{
if(book[i]==0) //标记i张卡片为0(也即此卡片还在手上)
{
a[step]=i; //放到编号为step的盒子里
book[i]=1; //即标记本次扑克被从手中拿走
dfs(step+1); //递归调用实现对step+1个盒子的尝试
book[i]=0; //每次都要将尝试过的收回,才能进行下次的尝试!(很重要)
}
}
return;//void函数
}
int main()
{
scanf(“%d”,&n); //输入n的个数
dfs(1); //从第一个盒子开始
return 0;
}