以n=3为例,假设有3个空位,依次往空位上填数,填到123发现数填完了,此时就要回到1 2_ ,但是1 2 3 已经存在了,于是再回到1_ _,这时第二个空位上还能填3构成1 3_,再往第三个空位上填数,数都用完后再回溯,以此类推就能得到全部可能结果,可以发现,dfs其实就是一棵树的先序遍历。
#include <iostream>
using namespace std;
int i,j,n,a[10],b[10];//数组a存组合;数组b用来标记第i个数是否使用过
void dfs(int x)
{
if(x>n)
{
for(j=1;j<=n;j++)
{
cout<<a[j]<<' ';
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(!b[i])//判断数字有没有被使用过
{
a[x]=i;
b[i]=1;//标记已使用数字
dfs(x+1);//往空白处填数
b[i]=0;//清除标记
}
}
}
int main()
{
cin>>n;
dfs(1);//先往第一个位置填数
return 0;
}