ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入一个字符串,输出其所有的排列组合。

 

思路:分别将每一个字符固定在首位置,然后求后面字符的排列组合,递归的思想。

代码如下:

1 void Permutation(char *Str)
2 {
3     assert (Str != NULL);
4 
5     Permutation (Str, Str);
6 }
 1 void Permutation(char *Str, char *pTemp)
 2 {
 3     assert (Str != NULL);
 4 
 5     assert (pTemp != NULL);
 6 
 7     if (*pTemp == '\0')
 8     {
 9         printf ("%s\n", Str);
10 
11         return;
12     }
13 
14     for (char *pCh = pTemp; *pCh != '\0'; ++pCh)
15     {
16         Swap (*pCh, *pTemp);
17 
18         Permutation (Str, pTemp + 1);
19 
20         Swap (*pCh, *pTemp);
21     }
22 }

利用C++的template写了一个抽象类型的交换两个操作数内容的函数:

 1 template<typename T>
 2 void Swap(T &OperatorA, T &OperatorB)
 3 {
 4     // 这个判断是非常有必要的
 5     // 因为如果要交换的两个数相等
 6     // ,那么用位运算异或之后就都变成了0
 7     // 非但不能交换两个操作数里面的内容,反而破坏了原来的数据,这一点必须避免
 8     if (OperatorA != OperatorB)
 9     {
10         OperatorA ^= OperatorB;
11         OperatorB ^= OperatorA;
12         OperatorA ^= OperatorB;
13     }
14 }

一个测试结果:

posted on 2013-05-03 14:03  ldjhust  阅读(173)  评论(0编辑  收藏  举报