本程序参考STL系列之十 全排列(百度迅雷笔试题)
全排列的思想是从第一个数字起的每个数字分别于后边的数字进行交换。
//用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,
//如 abc 的全排列: abc, acb, bca, dac, cab, cba
#include <stdio.h>
#include <string.h>
void Swap(char *a,char *b)
{
char t = *a;
*a = *b;
*b = t;
}
bool IsSwap(char *str, int begin, int end)
{
for(int i = begin; i < end; i++)
if(str[i] == str[end])
return false;
return true;
}
void AllRange(char *str, int k, int m)
{
if(k == m)
{
static int s_i = 1;
printf("第%-3d个排列 %s \n", s_i++,str);
}
else
{
for(int i = k; i <= m; i++)
{
if(IsSwap(str,k,i))
{
Swap(str + k, str + i);
AllRange(str, k + 1, m);
Swap(str + k, str + i);
}
}
}
}
void Foo(char *str)
{
AllRange(str, 0, strlen(str) - 1);
}
void main()
{
char str[] = "12345";
Foo(str);
}
这个递归的方法是在调用AllRange函数前,交换一对数字,使得每一个数都有机会与后边的每一个数进行分别交换,这样就可以达到全排列的目的了。AllRange函数前调用Swap函数是为了交换一对数,AllRange函数之后调用Swap函数是将这个序列恢复,保证这个序列的正确输出。