求排列(全排列问题)
求排列
设有n个整数的集合{1,2,…,n}(n<13),从中取出任意r个数进行排列(r<n),试列出所有的排列。
输入
n,r
输出
以由小到大的字典序输出n(1<=n<=9)
样例输入
3 3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
(这题知道dfs模板就会呀。。。)
代码:
#include <bits/stdc++.h>
using namespace std;
int n,r;
int a[101];
bool v[101];
void dfs(int k)
{
if(k==r+1)
{
for(int i=1;i<=r;i++)
{
cout << a[i] << ' ';
}
cout << "\n";
return;
}
for(int i=1;i<=n;i++)
{
if(v[i]==false)
{
a[k]=i;
v[i]=true;
dfs(k+1);
v[i]=false;
}
}
}
int main()
{
cin >> n >> r;
dfs(1);
return 0;
}
那么 (咳咳:
延伸一道题吧
全排列问题
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入
n(1<=n<=9)
输出
由1~n组成的所有不重复的数字序列,每一行一个序列,每个数字前4个空格。
样例输入
3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
则:
#include <bits/stdc++.h>
using namespace std;
int a[101],n;
bool v[21];
void dfs(int k)
{
if(k == n+1)
{
for(int i=1;i<=n;i++)
{
cout << a[i] << " ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(v[i]==false)
{
a[k] = i;
v[i] = true;
dfs(k+1);
v[i] = 0;
}
}
}
int main()
{
cin>>n;
dfs(1);
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/17189390.html