1:从n个数中取r个数,并区分顺序
(当r==n时,即为n个数的全排列);
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int r,n;
int ans[20];
bool vis[20];
int cnnt=0;
void dfs(int cnt)
{
//memset(vis,0,sizeof(vis));
if (cnt==r)
{
for (int i=1; i<=r; i++)
{
cout << ans[i] << ' ';
cnnt=0;
}
cout << '\n';
return ;
}
for (int i=1; i<=n; i++)
{
if (vis[i]==0)
{
ans[cnt+1]=i;
vis[i]=1;
dfs(cnt+1);
vis[i]=0;
}
}
}
int main()
{
cin >> n >> r;
dfs(0);
return 0;
}
2:组合问题,只取数,不考虑顺序;
只需要对情况1进行一下去重操作,比如保证填的数要大于上一个填的数,使数组按字典序排列,
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int r,n;
int ans[20];
bool vis[20];
int cnnt=0;
void dfs(int cnt)
{
//memset(vis,0,sizeof(vis));
if (cnt==r)
{
for (int i=1; i<=r; i++)
{
cout << ans[i] << ' ';
cnnt=0;
}
cout << '\n';
return ;
}
for (int i=1; i<=n; i++)
{
if (vis[i]==0)
{
if (cnt==0 || i>ans[cnt])//判断是否为递增关系
{
ans[cnt+1]=i;
vis[i]=1;
dfs(cnt+1);
vis[i]=0;
}
}
}
}
int main()
{
cin >> n >> r;
dfs(0);
return 0;
}