• 全排列


    交换两个数:

    template<class T>
    void exchange(T & f, T & s)
    {
        T t = f;
        f = s;
        s = t;
    };

    递归方式——递归节:

    void fullPermutation(int * fullArray, int start, int number, int & count)
    {
        if(start >= number)
        {
            cout << count + 1 << "	:" ;
            for(int i = 0;i < number; ++ i)
                cout << fullArray[i] << " ";
            cout << endl;
            count ++;
        }
        else
            for(int i = start; i < number; ++ i)
            {
                exchange(fullArray[start], fullArray[i]);
                fullPermutation(fullArray, start+1, number, count);
                exchange(fullArray[start], fullArray[i]);
            }
    }

    递归方式——精简:

    int fullPermutation(int number)
    {
        int * fullArray = new int[number];
        for (int i = 0;i < number;i ++)
            fullArray[i] = i + 1;
        int icount = 0;
        fullPermutation(fullArray, 0, number, icount);
        delete[] fullArray;
        return icount;
    }

    逆转数组:

    void reverseArray(int * fullArray, int number)
    {
        int i(0), j(number - 1);
        while (i < j)
            exchange(fullArray[i ++], fullArray[j --]);
    }

    找到传说中XY的索引坐标:

    找到最后一个这样的xindex,使的fullArray[xindex] < fullArray[xindex + 1];

    xindex之后找到最后一个这样的yindex,使的fullArray[xindex] < fullArray[yindex];

    int findXY(int * fullArray, int number, int &xindex, int &yindex)
    {
        xindex = -1;
        for (int i = 0; i < number - 1; ++ i)
        {
            if (fullArray[i] < fullArray[i + 1])
            {
                xindex = i;
                yindex = i + 1;
            }
            else if (xindex != -1 && fullArray[xindex] < fullArray[i + 1])
                yindex = i + 1;
        }
        return xindex;
    }

    非递归方式产生全排列:

    void fullPermutation2(int * fullArray, int number, int & count){
        int xindex(-1);
        int yindex(-1);
        count = 1;
        cout << count << "	:" ;
        for(int i = 0;i < number; i ++)
            cout << fullArray[i] << " ";
        cout << endl;
        while (-1 != findXY(fullArray,number, xindex, yindex))
        {
            exchange(fullArray[xindex], fullArray[yindex]);
            reverseArray(fullArray + xindex + 1, number - xindex -1);
            cout << ++ count << "	:" ;
            for(int i = 0;i < number; i ++)
                cout << fullArray[i] << " ";
            cout << endl;
        }
    }

    非递归方式精简:

    int fullPermutation2(int number)
    {
        int * fullArray = new int[number];
        for (int i = 0;i < number;i ++)
            fullArray[i] = i + 1;
        int icount = 0;
        fullPermutation2(fullArray, number, icount);
        delete[] fullArray;
        return icount;
    }

    测试

    #include <iostream>
    
    using namespace std;
    
    
    int main()
    {
        int number;
        cout << "Number:" << endl;
        cin >> number;
    
        int firstmethod = fullPermutation(number);
        int secondmethod = fullPermutation2(number);
    
        cout << "the size of results int first method is 	" << firstmethod << endl;
        cout << "the size of results int second method is 	" << secondmethod << endl;
    
        system("pause");
        return 0;
    }
    出自datakv
  • 相关阅读:
    CF1093F Vasya and Array
    CF1093D Beautiful Graph
    mysql主主同步
    mysql主从机制的部署与应用
    什么是多项式?
    从线性逼近到多项式逼近:泰勒级数
    机器学习--boosting家族之XGBoost算法
    倾情大奉送--Spark入门实战系列
    [机器学习笔记] 什么是分类,什么是回归?
    kafka中处理超大消息的一些考虑
  • 原文地址:https://www.cnblogs.com/datakv/p/5606380.html
Copyright © 2020-2023  润新知