博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全排列算法
阅读量:5239 次
发布时间:2019-06-14

本文共 1127 字,大约阅读时间需要 3 分钟。

全排列算法:

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

转载于:https://www.cnblogs.com/wonderKK/archive/2012/04/05/2433694.html

你可能感兴趣的文章
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
【codevs1033】 蚯蚓的游戏问题
查看>>
【程序执行原理】
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
PHP 导出 Excell
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
ubuntu 14.04 安装搜狗拼音输入法
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
Java内部类详解
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>