【题目】求从字符串中”ABCD”中任取3个元素构成的所有排列组合

    1. 排列组合 - 图1%7D%5En%20%20%3D%20C%7Blen(str)%7D%5En%20*A%7Bn%7D%5En#card=math&code=A%7Blen%28str%29%7D%5En%20%20%3D%20C%7Blen%28str%29%7D%5En%20%2AA_%7Bn%7D%5En&id=Yhntw)
    2. 先从ABCD中选3个元素,然后对这三个元素进行全排列

    【结果】
    排列组合 - 图2

    【代码】

    1. #include<stdio.h>
    2. int combination_permutation(char tmp[], int n);
    3. int combination(char *tmp,int m, int index);
    4. int permutation(char str[],int sbegin, int send);
    5. void swap(char *c1, char *c2);
    6. int main() {
    7. char tmp[50];
    8. int n;
    9. int cnt;
    10. scanf("%s", tmp);
    11. scanf("%d", &n);
    12. // tmp中选n个进行全排列
    13. cnt = combination_permutation(tmp, n);
    14. printf("\n种数:%d\n", cnt);
    15. return 0;
    16. }
    17. int combination_permutation(char tmp[], int n) {
    18. return combination(tmp, n, 0);
    19. }
    20. char arr[50];
    21. // 在tmp数组中选m个,第m个放在index的位置
    22. int combination(char *tmp,int m, int index) {
    23. int case1, case2;
    24. if (m==0) { //选完了
    25. // 把arr进行全排列
    26. arr[index] = '\0';
    27. //printf("%s\n", arr);
    28. return permutation(arr, 0, index-1);
    29. }
    30. if (*tmp!='\0') {
    31. //选*tmp
    32. arr[index] = *tmp;
    33. case1 = combination(tmp+1, m-1, index+1);
    34. //不选*tmp
    35. case2 = combination(tmp+1, m, index);
    36. return case1 + case2;
    37. }
    38. return 0;
    39. }
    40. // 将str中[sbegin, send]中进行全排列
    41. int permutation(char str[], int sbegin, int send) {
    42. int i;
    43. int cnt=0;
    44. if(sbegin == send) {//当 sbegin = send时输出
    45. for( i = 0; i<=send; i++) //输出一个排列
    46. printf("%c", str[i]);
    47. printf("\n");
    48. return 1;
    49. }
    50. else {
    51. for( i = sbegin; i <= send; i++) {//循环实现交换和sbegin + 1之后的全排列
    52. swap(&str[i], &str[sbegin]); //把第i个和第sbegin进行交换
    53. cnt += permutation(str, sbegin + 1, send);
    54. swap(&str[i], &str[sbegin]); //【注1】交换回来
    55. }
    56. }
    57. return cnt;
    58. }
    59. void swap(char *c1, char *c2) {
    60. char tmp;
    61. tmp = *c1;
    62. *c1 = *c2;
    63. *c2 = tmp;
    64. }

    【如果只选3个,可以用以下暴力的方法】

    1. /*
    2. * @Test:口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取3个球,问取到3种不同颜色的球的可能取法,输出每种排列的情况
    3. */
    4. #include<stdio.h>
    5. int main() {
    6. enum Color {red,yellow,blue,white,black};
    7. enum Color i,j,k,pri;
    8. int n,loop;
    9. n=0;
    10. for (i=red; i<=black; i++) {
    11. for (j=red; j<=black; j++) {
    12. if (i!=j) {
    13. for (k=red; k<=black; k++) {
    14. if ( (i!=k) && (j!=k) ) {
    15. n++;
    16. printf("%-4d",n);
    17. for(loop=1; loop<=3; loop++) {
    18. switch (loop) {
    19. case 1:pri=i;break;
    20. case 2:pri=j;break;
    21. case 3:pri=k;break;
    22. default:break;
    23. }
    24. switch(pri) {
    25. case red : printf("%-10s","red"); break;
    26. case yellow : printf("%-10s","yellow"); break;
    27. case blue : printf("%-10s","blue"); break;
    28. case white : printf("%-10s","white"); break;
    29. case black : printf("%-10s","black"); break;
    30. default:break;
    31. }
    32. }
    33. printf("\n");
    34. }
    35. }
    36. }
    37. }
    38. }
    39. printf("\ntotal:%5d\n",n);
    40. return 0;
    41. }