算法練習之前n個數的全排列(1=

題目:輸入一個數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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章