之十 全排列问题
笔试绿盟科技的时候碰到这道题,光知道应该用递归来做,可是当时想了好久都没有想出来,后来找到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 }