啊哈算法学习记录:
dfs实例–扑克牌放法
题目:
在上-章我们留下了一个问题:输入一个数 n ,输出1-n的全排列。这里我们先将这个起形象化举个例子。假如有编号为1,2,3的3张扑克牌和编号为1,2,3的3个盒子。现在需要将这3张扑克牌分别放到3个盒子里而,并且每个盒子有且只能放一张扑克牌,那么共有多少种不同的放法呢?
思想核心:
for(i=1;i<=n;i++)
{
if(b[i]==0) //b[i]==0表示这个数字未被使用
{
a[sp]=i; //在这里要小心不要将其写成是a[i]=i;
b[i]=1; //表示已被使用
dfs(sp+1);
b[i]=0; //为接下来的回溯做准备
}
}
判断结束:
if(sp==n+1) //要的是n个数的组合,所以到n+1停就行
{
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
return ;
}
尤其要注意在函数里面是a[sp],而不是a[i],因为sp代表的是第几位数。
完整代码:
#include&l