zoukankan      html  css  js  c++  java
  • 全排列算法

    全排列算法:

    #include<iostream>
    using namespace std;

    template <class Type>
    void Perm(Type list[], int k, int m)
    {
        if(k==m)                      
        {
            for(int i=0; i<=m; i++)
                cout << list[i];
            cout << endl;
        }
        else
          for(int j=k; j<=m; j++)
          {
              Swap(list[k],list[j]);
              Perm(list, k+1, m);
              Swap(list[k],list[j]);
          }
    }

    template<class Type>
    inline void Swap(Type &a, Type &b)
    {
        Type temp=a;
        a=b;
        b=temp;
    }

    这是经典的全排列算法。m和k分别表示要进行全排列的元素范围,即两个端点的index,m为开始的index,k为结束端点index。

    template <class Type>
    //k和m表示需要被全排列的元素范围--两端点的index
    void Perm(Type list[], int k, int m)
    {
        if(k==m)    //被处理的范围缩小为0                  
        {
            for(int i=0; i<=m; i++)
                cout << list[i];
            cout << endl;
        }
        else
          for(int j=k; j<=m; j++)
          {
              Swap(list[k],list[j]);//下标为k和j的元素交换在数组中的位置
              Perm(list, k+1, m););/*每次调用时k+1,即全排列范围缩小1*/
              Swap(list[k],list[j]);//回溯的时候,还原为先前状态
          }
    }

    给你讲讲算法思想吧:
    假设我们求permute(abc)的全排列。permute(abc)的全排列=a+permute(bc)和b+permute(ac)和c+permute(ab)=…………….依次类推。所以就可以用递归做。而将abc拆分成a+bc,b+ac,c+ab的过程就是上面的:
          for(int j=k; j<=m; j++)
          {
              Swap(list[k],list[j]);
              Perm(list, k+1, m);
              Swap(list[k],list[j]);
          }
    这个过程。做好以后还要换回来,恢复原状,接着做。
    当最后只有1个字母的时候,即k=m的时候,只有一种情况,因而输出。

  • 相关阅读:
    图床_shell命令grep/egrep
    图床_shell命令vi/vim
    图床_shell命令tr
    图床_shell命令wc
    图床_shell命令vimdiff
    图床_shell命令diff
    图床_shell命令rev
    图床_shell命令cut
    图床_shell命令tail
    图床_shell命令head
  • 原文地址:https://www.cnblogs.com/wonderKK/p/2433694.html
Copyright © 2011-2022 走看看