Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243882
  • 博文数量: 62
  • 博客积分: 973
  • 博客等级: 准尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-16 23:25
文章分类

全部博文(62)

文章存档

2013年(1)

2012年(14)

2011年(47)

分类: C/C++

2011-12-29 04:49:26

  1. #include "stdafx.h"
  2. #include <string.h>

  3. #define MAXLEN 128

  4. bool flags[MAXLEN];
  5. char output[MAXLEN];

  6. /* 全排列:
  7.  * n个字符全排列,轮流将数组中每个数字放在第一位上,
  8.  * 然后调用剩下n-1个数字的全排列。以此形成递归。
  9.  * @parame every 必须从0开始
  10.  */
  11. void permutation(char input[], int len, int every)
  12. {
  13.     int i;
  14.     for(i = 0; i < len; ++i)
  15.     {
  16.         if(false == flags[i])
  17.         {
  18.             output[every] = input[i];
  19.             if(every == len - 1) //the last char has checked
  20.             {
  21.                 output[len] = '\0';
  22.                 printf("%s\n", output);
  23.                 return;
  24.             }
  25.             else
  26.             {
  27.                 flags[i] = true;
  28.                 permutation(input, len, every+1);
  29.                 flags[i] = false;
  30.             }
  31.         }
  32.     }
  33.     return;
  34. }

  35. // another same way
  36. void doPermutation(char input[], int len, int every)
  37. {
  38.     int i;

  39.     if(every == len) // make sure data[len-1] was handled below
  40.     {
  41.         printf("%s\n", output);
  42.         return;
  43.     }
  44.     for(i = 0; i < len; ++i)
  45.     {
  46.         if(false == flags[i])
  47.         {
  48.             flags[i] = true;
  49.             output[every] = input[i];
  50.             if(every == len - 1)
  51.             {
  52.                 output[len] = '\0';
  53.             }
  54.             doPermutation(input, len, every+1);
  55.             flags[i] = false;
  56.             
  57.         }
  58.     }
  59. }

  60. /* 组合:
  61.  * 比如输入1,2,3,4长度为len,输出所有长度为k(k<len)的组合,
  62.  * 比如k=3时,有123,124,134,234,共四种。
  63. */
  64. /* 在n个元素中取m个的组合,对每一个元素可以将此问题划分为两个子问题:
  65.  * 1)把该元素放入组合中:在剩下的n-1个可选数据求得可能的m-1个元素的组合
  66.  * 2)不把该元素放到组合中:在剩下的n-1个可选数据求得可能的m个元素的组合
  67.  * @parame cur, pos 必须从0开始。
  68.  */
  69. void combination(char input[], int k, int cur, int pos )
  70. {
  71.     int i;
  72.     if(0 == k)
  73.     {
  74.         for(i = 0; i < pos; ++i)
  75.             printf("%c", output[i]);
  76.         printf("\n");
  77.         return;
  78.     }
  79.     if('\0' == input[cur])
  80.         return;

  81.     output[pos] = input[cur];
  82.     combination(input, k-1, cur+1, pos+1);
  83.     pos--;
  84.     combination(input, k, cur+1, pos+1);
  85. }

  86. // another same way
  87. void doCombination(char input[], int len, int k, int cur, int pos )
  88. {
  89.     if(cur >= len) return;
  90.     if(0 == k) return;
  91.         
  92.     output[pos] = input[cur];
  93.     if(1 == k)
  94.     {
  95.         output[pos+1] = '\0';
  96.         printf("%s\n", output);
  97.     }
  98.     doCombination(input, len, k-1, cur+1, pos+1);
  99.     pos--;
  100.     doCombination(input, len, k, cur+1, pos+1);
  101. }

  102. int _tmain(int argc, _TCHAR* argv[])
  103. {
  104.     char input[] = "1234";
  105.     int i,k = 3;
  106.     
  107.     int len;
  108.     len = strlen(input);
  109.     memset(flags, false, MAXLEN);

  110.     //permutation(input, len, 0);
  111.     //doPermutation(input, len, 0);
  112.     combination(input, k, 0, 0);
  113.     //doCombination(input, len, k, 0, 0);
  114.     printf("-------------------------\n");
  115.     //所有组合
  116.     for(i=1; i<len; ++i)
  117.         combination(input, i, 0, 0);
  118.     
  119.     return 0;
  120. }
阅读(1783) | 评论(0) | 转发(0) |
0

上一篇:有序合并单链表

下一篇:寻找丑数

给主人留下些什么吧!~~