全排列程序

算法:递归出口:集合中只有一个元素时,即exPos == setNum时,打印一个排列。
           继续递归条件:当exPos<setNum时,递归地产生前缀set[0:setNum-2],最后回到出口,结束递归。
过程中需要交换元素,把后面的元素依次与第一个元素交换,这样就可以第次只处理后setNum-1个元素,而
依次递归,就可以最终到达exPos==setNum的出口条件。

#include <iostream>

using namespace std;

//list is the whole set.
//exPos is the position to exchange with the first element.
//the numbers of the whole set.
void  wholeArrage(char* list, int exPos, int setNum);
inline void Swap(char& c1, char& c2);

int main()
{
    char set[] = {'a', 'b','c'};
    int setNum = 3;

    wholeArrage(set, 0, setNum);
    return 0;
}

void wholeArrage(char* list, int exPos, int setNum)
{
static int count = 0;
if (exPos == setNum-1)
{
count ++;
for (int i = 0; i < setNum; i++)
    cout << list[i];
cout << " ";
if (count % 10 == 0)
    cout << endl;
}
else
{
for (int i = exPos; i < setNum; i++)
{
Swap(list[i], list[exPos]);
wholeArrage(list, exPos+1, setNum);
            Swap(list[i], list[exPos]);
}
}

}

inline void Swap(char& c1, char& c2)
{
char tmp = c1;
c1 = c2;
c2 = tmp;
}

时间: 2025-01-30 08:20:21

全排列程序的相关文章

PHP全排列算法实现程序代码

  从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 简介 如1,2,3三个元素的全排列为: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 共3*2*1=6种 3! 2公式 全排列数f(n)=n!(定义0!=1) 递归算法 1,2,3 1,3,2 2,1,3 2,3,1 3,2,1 3,1,2 这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题.所以我提出了解决

求字符串全排列的递归算法(java程序)

import java.util.ArrayList; import java.util.List; /** * 求字符串的全排列 * * @author wenin819 * */ public class Arrange { /** * 判断调用求排列的主要方法 */ public static List<String> arrange(String input){ if(null == input || 0 == input.length()){ System.out.println(&

程序员面试资源大收集(转)

资源一:<crack the code interview>--谷歌资深技术面试官经典之作 本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网Jay13补充. 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2.4 求由两个链表结点组成的数

[程序员面试题精选100题]58.八皇后问题

题目 在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法. 思路 这就是有名的八皇后问题.解决这个问题通常需要用递归,而递归对编程能力的要求比较高.因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力. 由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行.于是我们可以定义一个数组colIndex[8],colI

全排列算法的非递归实现与递归实现的方法(C++)_C 语言

(一)非递归全排列算法基本思想是:    1.找到所有排列中最小的一个排列P.    2.找到刚刚好比P大比其它都小的排列Q,    3.循环执行第二步,直到找到一个最大的排列,算法结束.下面用数学的方法描述:给定已知序列 P =  A1A2A3An ( Ai!=Aj , (1<=i<=n  , 1<=j<=n, i != j  ) )找到P的一个最小排列Pmin = P1P2P3Pn  有  Pi > P(i-1) (1 < i <= n)从Pmin开始,总是目

深入全排列算法及其实现方法_C 语言

全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路.  给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列.一.递归实现例如,如果集合是{a,b,c},那么这个集合中元素的所有排列是{(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)},显然,给定n个元素共有n!种不同的排列,如果给定集合是{a,b,c,d},可以用下面给出的简单算法产生其所有排列,即集合(a,b,c,

使用C语言解决字符串全排列问题_C 语言

问题输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路这是典型的递归求解问题,递归算法有四个特性:     必须有可达到的终止条件,否则程序陷入死循环     子问题在规模上比原问题小     子问题可通过再次递归调用求解     子问题的解应能组合成整个问题的解 对于字符串的排列问题: 如果能生成n-1个元素的全排列,就能生成n个元素的全排列.对于只有一个元素的集合,可以直接生

ACMer程序员智力拾遗

       浏览网页偶得,遂记录下来,每天进步一点点--        博客园真是个不错的平台,今天我让师姐也注册了--        学会分享吧,孩子们-- 一.编程中无穷大量的设置        如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7ff

字符串 全排列生成问题

转自:http://blog.csdn.net/zinss26914/article/details/8939140 问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 1.这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上比原问题小 子问题可通过再次递归调用求解 子问题的解应能组合成整个问题的解 2.对于字符串的排列问