全排列——递归方法

来源:互联网 发布:专业美工软件 编辑:程序博客网 时间:2024/06/05 03:08

与网络上大多数方法相比,该方法可以处理
[1 1 1]重复生成的问题 -》c采用set

#include <iostream>#include <vector>#include <set>using namespace std;int n = 0;vector<string> con;set<string> res;void resprint() {    for (set<string>::iterator it = res.begin(); it != res.end(); it++)        cout << "[ " << *it << "]\n";    cout <<"全排列组合数:" <<res.size() <<endl;    res.clear();    return ;}void swap(int &a, int &b){    /*    函数名:swap(int &a,int &b);    函数作业:传值:对a,b进行交换。    */    int m = a;    a = b;    b = m;}void perm(vector<string> list, int k, int m){    /*     函数名:perm(vetcor<int> list,int k , int m );     传入参数:将要被排列的数组list,当前下标k,m为当前排列数组的长度。     核心思想:     递归公式:     递归点:当下标指到最后一位时:输出当前的list。     */    if (k == m)//k如果已经到达最后一位就输出当前的list;    {        string temp = "";        for (int i = 0; i <= m; i++) {            temp += list[i] + " ";        }        res.insert(temp);        return;    }    for (int i = k; i <= m; i++)    {        swap(list[k], list[i]);//将当前数组的首位一次与后面的元素交换位置。        perm(list, k + 1, m);  //进行递归。        swap(list[k], list[i]);//需要换回来 每次都是基于当前最初的数组。    }}int main(){   string length;    while (1) {        cout << "请您输入序列的个数(不要超过100000000):(输入q退出)" << endl;        cin >>  length;        if (length[0] == 'q' && length.size() == 1) {            cout << "感谢您的使用!" << endl;            break;        }        int i = 0;        while ( '0' <= length[i] && length[i] <= '9')            i++;        if (i == (length.size() ))        {   n = atoi( length.c_str() );            if (n > 100000000)                cout << "对不起,您输入的数字太大。\n请您重新输入:" << endl;            else if (n == 0)                cout << "对不起,您输入的数字为负数。\n请您重新输入:" << endl;            else {                cout << "您输入序列的元素个数为: " << n << endl;                for (int i = 0; i < n; ++i)                {                    string temp;                    cin >> temp;                    con.push_back(temp);                }                printf("您输入的序列为:[ ");                for (int i = 0; i < n; ++i)                {                    cout << con[i] << " " ;                }                printf("]\n下面输出该序列的全排列:\n");                perm(con, 0, n - 1);                resprint();                printf("\n");            }        } else            cout << "请输入大于0的数字" << endl;        con.clear();    }    return 0;}
原创粉丝点击