题目:输入一个数n,打印出它前n个数序列的全排列。
思路:
1、用STL库函数next_permutation,代码如下
//STL库函数法
vector<vector<int>> STL_function(vector<int> &num)
{
vector<vector<int>> result;
do
{
result.push_back(num);
}while(next_permutation(num.begin(),num.end()));
return result;
}
2、递归回溯法:每个元素与第一个元素交换,交换后得到子序列,递归求解子序列的全排列。可以这样理解,当n=1时,只有一个排列,n>1时,是第一个数与剩下子序列全排列的排列。
//递归回溯法
void DG_function(vector<int> &num,int start,int end,vector<vector<int>> &result1)
{
if(start==end)
result1.push_back(num);
for(int i=start;i<=end;i++)
{
swap(num[start],num[i]);
DG_function(num,start+1,end,result1);
swap(num[start],num[i]);
}
}
测试代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//STL库函数法
vector<vector<int>> STL_function(vector<int> &num)
{
vector<vector<int>> result;
do
{
result.push_back(num);
}while(next_permutation(num.begin(),num.end()));
return result;
}
//递归回溯法
void DG_function(vector<int> &num,int start,int end,vector<vector<int>> &result1)
{
if(start==end)
result1.push_back(num);
for(int i=start;i<=end;i++)
{
swap(num[start],num[i]);
DG_function(num,start+1,end,result1);
swap(num[start],num[i]);
}
}
void print(vector<vector<int>> v)
{
for(vector<vector<int>>::iterator iter=v.begin();iter!=v.end();iter++)
{
vector<int> vv=*iter;
for(vector<int>::iterator it=vv.begin();it!=vv.end();it++)
cout<<*it;
cout<<endl;
}
}
int main()
{
int n,k;
vector<int> num;
vector<vector<int>> result,result1;
cin>>n;
for(int i=1;i<=n;i++)
num.push_back(i);
result=STL_function(num);
DG_function(num,0,n-1,result1);
cout<<"STL_function : "<<endl;
print(result);
cout<<"DG_function : "<<endl;
print(result1);
return 0;
}