1.参考链接
参考:啊哈算法[啊哈磊著]
第四章第1节:不撞南墙不回头——深度优先搜索
链接2:递归实现全排列问题
2.完整代码
#include <iostream>
using namespace std;
int a[10],book[10],n; //c语言的全局变量在没有赋值以前默认为0
//book 表示已经使用的扑克牌,book[i]=1表示数字为i的扑克牌已经放进了箱子里。手中已经没有该扑克牌了。
//book[i]=0表示i号扑克牌还在手上。
void dfs(int step) //step表示此时站在第step个箱子面前。
{
if(step==n+1) //如果站在第n+1个箱子面前,则表示前n 个箱子已经放好扑克牌
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return; //打印完毕一定要return,否则程序会一直运行下去。 ???为什么呢?
}
for(int i=1;i<=n;i++)
{
if(book[i]==0)
{
a[step]=i; //将i号扑克牌放到第step个盒子中。
book[i]=1; //将book[i]设为1,表示该扑克牌已经不在手上了。
dfs(step+1); //第step 个盒子已经放好扑克牌,接下来需要走到下一个盒子面前。
book[i]=0; //这是非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试。
//并不明白什么意思、、、、、
}
}
return;
}
int main()
{
cin>>n;
dfs(1); //首先站在第一个箱子面前。 从第一个箱子开始
system("pause");
return 0;
}
运行结果:
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
请按任意键继续. . .