• 全排列


    一、全排列的递归实现(不考虑去重)

    从第一个数字起,每个数分别与它后面的数字交换

     1 #include <iostream>
     2 #include <vector>
     3 #include <string>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 //全排列的递归实现(不考虑去重)
     8 //k表示当前选取到第几个数,m表示共有多少数
     9 void AllRange(string pszStr, int k, int m)
    10 {
    11     if (k == m)
    12     {
    13         static int num = 1;
    14         cout << "" << num++ << "个排列" << " : " << pszStr << endl;
    15     }
    16     else
    17     {
    18         for (int i = k; i <= m; i++) //第i个数分别与它后面的数字交换就能得到新的排列
    19         {
    20             swap(pszStr[k], pszStr[i]);
    21             cout <<"swap1: " << pszStr << endl;
    22             AllRange(pszStr, k + 1, m);
    23             swap(pszStr[k], pszStr[i]);
    24             cout <<"swap2: " << pszStr << endl;
    25         }
    26     }
    27 }
    28 void Foo(string pszStr)
    29 {
    30     AllRange(pszStr, 0, pszStr.length() - 1);
    31 }
    32 int main()
    33 {
    34     string szTextStr = "123";
    35     cout << "全排列的递归实现:" << endl;
    36     cout << szTextStr << "的全排列如下:" << endl;
    37     Foo(szTextStr);
    38     return 0;
    39 }

    全排列的递归实现:
    123的全排列如下:
    swap1: 123
    swap1: 123
    第1个排列 : 123
    swap2: 123
    swap1: 132
    第2个排列 : 132
    swap2: 123
    swap2: 123
    swap1: 213
    swap1: 213
    第3个排列 : 213
    swap2: 213
    swap1: 231
    第4个排列 : 231
    swap2: 213
    swap2: 123
    swap1: 321
    swap1: 321
    第5个排列 : 321
    swap2: 321
    swap1: 312
    第6个排列 : 312
    swap2: 321
    swap2: 12
    3

    二、全排列的递归实现(考虑去重)

    从第一个数字起每个数分别与它后面非重复出现的数字交换。第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。

     1 #include <iostream>
     2 #include <vector>
     3 #include <string>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 //[begin,end)中是否有数字与下标为end的数字相等
     8 bool IsSwap(string s, int begin, int end)
     9 {
    10     for (int i = begin;i < end;i++)
    11         if (s[i] == s[end])
    12             return false;
    13     return true;
    14 }
    15 
    16 //全排列的递归实现(考虑去重)
    17 //k表示当前选取到第几个数,m表示共有多少数
    18 void AllRange(string pszStr, int k, int m)
    19 {
    20     if (k == m)
    21     {
    22         static int num = 1;
    23         cout << "" << num++ << "个排列" << " : " << pszStr << endl;
    24     }
    25     else
    26     {
    27         for (int i = k; i <= m; i++) //第i个数分别与它后面的数字交换就能得到新的排列
    28         {
    29             if(IsSwap(pszStr,k,i))
    30             {
    31                 swap(pszStr[k], pszStr[i]);
    32                 cout << "swap1: " << pszStr << endl;
    33                 AllRange(pszStr, k + 1, m);
    34                 swap(pszStr[k], pszStr[i]);
    35                 cout << "swap2: " << pszStr << endl;
    36             }
    37         }
    38     }
    39 }
    40 
    41 void Foo(string pszStr)
    42 {
    43     AllRange(pszStr, 0, pszStr.length() - 1);
    44 }
    45 
    46 int main()
    47 {
    48     string szTextStr = "122";
    49     cout << "全排列的递归实现:" << endl;
    50     cout << szTextStr << "的全排列如下:" << endl;
    51     Foo(szTextStr);
    52     return 0;
    53 }

    全排列的递归实现:
    122的全排列如下:
    swap1: 122
    swap1: 122
    第1个排列 : 122
    swap2: 122
    swap2: 122
    swap1: 212
    swap1: 212
    第2个排列 : 212
    swap2: 212
    swap1: 221
    第3个排列 : 221
    swap2: 212
    swap2: 122

  • 相关阅读:
    d3js 添加数据
    d3js 画布 概念
    Python中的 socket示例
    swift学习笔记
    加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
    socket编程中客户端常用函数
    WBS 与 甘特图
    C/C++ 数据结构之算法
    Linux集群服务 LVS
    Linux内核架构与底层--读书笔记
  • 原文地址:https://www.cnblogs.com/hslzju/p/5705398.html
Copyright © 2020-2023  润新知