全排列等价于:将N个牌放到N个盒子中
#include<iostream>
using namespace std;
int a[10],book[10],n;//全局变量默认初始化为0 ,book标记是否牌在手中
void dfs(int step)//step表示现在站在第几个盒子面前
{
int i;
if(step==n+1)//如果站在n+1个盒子面前,表示前面的n个盒子都已经放好了
{
for(i=1;i<=n;i++)
cout<<a[i];
cout<<endl;
return ;//返回之前的一步(最近一次调用dfs的地方) 注意在走完所有的盒子时候step==n+1一定立刻return;
}
for(i=1;i<=n;i++)
{
if(book[i]==0)//表示第i个牌仍在手
{
a[step]=i;//将i号扑克牌放入第step个盒子中
book[i]=1;//表示第i个扑克牌不在手上了
dfs(step+1);//第step个盒子放好牌,接下来走到下一个盒子面前
book[i]=0;//非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试</span>。
}
}
}
int main()
{
cin>>n;
dfs(1); //首先站在第1个盒子面前</span>
return 0;
}