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的时候,只有一种情况,因而输出。

  • 相关阅读:
    javascript平时小例子③(setInterval使用1)
    javascript平时小例子②(正则表达式验证邮箱)
    javascript平时小例子①(移动的小div)
    Ansible主机清单Inventory文件hosts
    K8s Deployment YAML 名词解释
    Linux自带神器logrotate详解
    Redis性能指标监控
    页面无任何操作30秒后退出1
    java 加法变乘法
    java 九数组分数
  • 原文地址:https://www.cnblogs.com/wonderKK/p/2433694.html
Copyright © 2011-2022 走看看