全排列(permutations)

来源:互联网 发布:怎么样成为淘宝客 编辑:程序博客网 时间:2024/05/21 21:50

算法设计时候,递归技巧可以很方便地解决一些复杂的问题。

求一串数字的全排列就可以用递归技巧写出程序。

例如,
[1,2,3] 有下列排列:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], 和 [3,2,1].

递归过程:

1,为了求[1,2,3]的全排列,可以先求子串[2,3]的全排列,最后将1加到结果中即可

2,求所有子串的全排列,即去掉2求子串[1,3],去掉3求子串[1,2]。

eg:

1开头:字串全排列[2,3],[3,2],得到[1,2,3],[1,3,2]

2开头:子串全排列[1,3],[3,1],得到[2,1,3],[2,3,1]

3开头:子串全排列[1,2],[2,1],得到[3,1,2],[3,2,1]

下面是测试程序:

/**  *输出全排列  *[1,2,3]有一下全排列  * [1,2,3],[1,3,2][2,1,3][2,3,1],[3,2,1],[3,1,2]  *  * *//**  *使用递归  * */#include <iostream>#include <vector>using namespace std;class permutations{public:    permutations() {}    vector<vector<int>> permute(vector<int> &num);};vector<vector<int>> permutations::permute(vector<int> &num){    vector<vector<int>> res;    // 递归结束条件,给定的一串数字num只有一个数字,则放入num中并返回结果    if(num.size()==0)    {        res.push_back(num);        return res;    }    // 当字符串长度>1,递归调用    for(unsigned int i=0;i<num.size();i++)    {        // 依次次提取数字串中的一个数字,得到剩余数字串        vector<int> subnum(num.begin(),num.end());        subnum.erase(num.begin()+i);        // 求剩余数字串的全排列        vector<vector<int>> subres;        subres=permute(subnum);        // 将剩余数字串的全排列结果每个排列上都添回num[i]        for(unsigned int j=0;j<subres.size();j++)        {            subres[j].insert(subres[j].begin(),num[i]);            res.push_back(subres[j]);        }    }    return res;}ostream &operator <<(ostream &o,vector<int> &v){    for(auto e:v)    {        o<<e<<" ";    }    return o;}int main(){    vector<int> test_vector{1,2,3};    // 输出test_vector    cout<<test_vector;    permutations p;    vector<vector<int>> res;    res=p.permute(test_vector);    // output res    for(unsigned int i=0;i<res.size();i++)    {        for(unsigned int j=0;j<res[i].size();j++)        {            cout<<res[i][j]<<" ";        }        cout<<endl;    }    cout << "Hello World!" << endl;    return 0;}


0 0
原创粉丝点击