之十 全排列问题

笔试绿盟科技的时候碰到这道题,光知道应该用递归来做,可是当时想了好久都没有想出来,后来找到CSDN上MoreWindows的博客里有详细的介绍。

题目是这样的:

  用C++写一个函数:实现数组或者字符串的全排列。

解题思想是:

从第一个数字起,分别同它之后的数字交换。

比如  123 ,一个数字分别跟第二个,第三个交换,生成数列 213 和 321,

    那么现在有三个 数列,分别是123 213 321 然后从第二个数字开始,往后交换,

    123 可以生产数列 123 132

    213 可以生成数列 213 231

    321 可以生成数列 321 312

这样就生成了所有的排列。

代码,参考自MoreWindows

 1 void swap(char *a, char *b)
 2 {
 3     char temp = *a;
 4     *a = *b;
 5     *b = temp;
 6 }
 7 
 8 void allrange(char *ptr, int k, int m)
 9 {
10     if (k == m)
11     {
12         static int s = 1;
13         printf("第%3d个排列\t%s\n", s++, ptr);    
14     }    
15     else
16     {
17         for (int i = k; i <= m; i++)
18         {
19              swap(ptr+k, ptr+i);
20              allrange(ptr, k+1, m);
21              swap(ptr+k, ptr+i);  
22         }    
23     }
24 }

测试一下

1 int main(int argc, char *argv[])
2 {
3     char ss[] = "1234";
4     allrange(ss, 0, 3);
5     system("PAUSE");
6     return EXIT_SUCCESS;
7 }

posted on 2012-11-22 17:39  乐则行之  阅读(96)  评论(0)    收藏  举报

导航