初学,加强一下理解
#include<iostream>
using namespace std;
int n,r,a[100],b[100];
/* 每次dfs都是从1到n中
选出一个数放在排列中第x个位置
*/
void dfs(int x)
{
if(x==r+1) //截止条件,只需要放r个数,当递归到第r+1时,则停止,并输出已经排好的r个数
{
for(int i=1;i<=r-1;i++)
cout<<a[i]<<" ";
cout<<a[r];
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0&&i>a[x-1]) // 第i个数是可用的,且保证不再重复
{
a[x]=i; // 将这个数放到x这个位置
b[i]=1; // 则这个数不能再使用了
dfs(x+1); // 往排列的下一个位置
b[i]=0; // 比如在三个数中选三个数做排列
/*
则刚开始,dfs(1)在i=1时进入dfs(2),dfs(2)在i=2时进入dfs(3),
dfs(3)在i=3时进入dfs(4)则可以输出一次结果,dfs(4)结束,
此时回到dfs(3),则b[3]=0,表明第三个数是可用的
而此时for循环也到了3,则dfs(3)结束,
回到dfs(2)中进入dfs(3)的地方,此时i=2,则b[2]=0,表明第二个数也可用
此时dfs(2)则表明还在尝试第二个位置能不能放其他的数,
for循环继续,i为3,发现第三个数可用,则放上第三个数,进入dfs(3),发现第二个数可用,放上
进入dfs(4),则输出另一个结果
*/
}
}
}
int main(void)
{
cin>>n>>r;
for(int i=1;i<=n;i++)
{
b[i]=0;
}
for(int i=1;i<=r;i++)
{
a[i]=0; //放排列数
}
dfs(1);
}