本题 递归求解,利用bool 数组标记哪一个数值被用到,
为了防止递归回溯时,发生 小编号重复被使用,造成多个组合不同顺序,
数字一样的这种情况,在递归时,再传递 当前下标 pos的参数。
每次使用当前pos 之后,会避免这种问题。
AC代码(有注释)
#include<iostream>
#include<cstdio>
using namespace std;
bool flag[30];
int n,r;
void dfs(int pos,int k)
{
if(k==r)
{
for(int i=1;i<=n;i++)
{
if(flag[i]) printf("%3d",i);
}
printf("\n");
}
for(int i=pos;i<=n;i++)
{
if(flag[i]==0)
{
flag[i]=1;
dfs(i+1,k+1);
flag[i]=0;
}
}
return;
}
int main()
{
scanf("%d%d",&n,&r);
dfs(1,0);
return 0;
}