Chinaunix首页 | 论坛 | 博客
  • 博客访问: 528213
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类: C/C++

2012-04-30 10:25:02

    对于一个给定的字符集合,将他们的所有组合进行打印。

local_zuhe.h

  1. #ifndef _LOCAL_ZUHE_H_
  2. #define _LOCAL_ZUHE_H

  3. #define MAX 80
  4. #define TRUE 1
  5. #define FALSE 0

  6. void zuhe(char *,int,char *);
  7. int puanduan(char *,int);
  8. void show(char *);
  9. #endif

zuhe.c

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include"local_zuhe.h"
  5. int length;
  6. void show(char *pans)
  7. {
  8.     int in = 0;

  9.     printf("************************************************************************************\n");
  10.     for( ; in < length;in++)
  11.         printf("%c ",pans[in]);
  12.     printf("&***********************************************************************************\n");
  13. }
  14. int panduan(char *ans, int len)
  15. {
  16.   int index =0;
  17.   int count[128] = {0};
  18.  
  19.   if(len == 0)
  20.       return FALSE;
  21.   for(index =0 ; index<len; index++) {
  22.         count[ans[index]-'0']++;
  23.         if(count[ans[index]-'0'] >1)
  24.             return FALSE;
  25.   }
  26.   return TRUE;
  27. }
  28. void Hzuhe(char *ans,int len)
  29. {
  30.     char * res = malloc( len *sizeof *res);
  31.     if(res == NULL)
  32.         goto out;
  33.     else
  34.         zuhe(res,len,ans);
  35. out:
  36.      free(res);
  37.      res = NULL;
  38. }
  39. void zuhe(char * ans, int len, char *p)
  40. {
  41.     int ij;
  42.     if(len >0) {
  43.         for(ij =0 ; ij < length;ij++) {
  44.            ans[length-len] =p[ij];
  45.            if(TRUE == panduan(ans,strlen(ans)))
  46.               zuhe(ans,len-1,p);
  47.             ans[length-len]=0;
  48.           }
  49.     } else
  50.           show(ans);
  51. }
  52. int main()
  53. {
  54.     char *p,*pans;

  55.     p = malloc(MAX * sizeof *p);
  56.     printf("please input the comnibation of the String\n");
  57.     pans = fgets(p,MAX,stdin);
  58.     if(NULL==pans)
  59.         goto out;//来自内核代码
  60.     length = strlen(pans)-1;
  61.     Hzuhe(pans,length);

  62. out:
  63.     free(pans);
  64.     pans = p = NULL;
  65.     return 0;
  66. }
测试之后发现,该程序只适用于无相同字符的字符串中。因此进行一下修改。以下标作为重新组合的参考因素对于相同字符则对其中一个进行全面的组合
例如:
         a  b   a
         发现有2个a,
         a b a
         a a b
         b a a
         b a a

改进之后

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include"local_zuhe.h"
  5. int length;


  6. void show(char *pans,char *pox)
  7. {
  8.     int in = 0;

  9.     for( ; in < length;in++)
  10.         printf("%c ",pox[pans[in]-'0']);
  11.     printf("\n&***********************************************************************************\n");
  12. }
  13. int panduan(char *ans, int len)
  14. {
  15.   int index =0;
  16.   int count[128] = {0};

  17.  
  18.   if(len == 0)
  19.       return FALSE;
  20.   for(index =0 ; index<len; index++) {
  21.         count[ans[index]-'0']++;
  22.         if(count[ans[index]-'0'] >1)
  23.             return FALSE;
  24.   }
  25.   return TRUE;
  26. }
  27. void Hzuhe(char *ans,int len)//对传来的字符串中的内容进行统计。设置不同的标志,如果其中有相同的字符,则跳过
  28. {
  29.     char * res = malloc( len *sizeof *res);
  30.     char * flag = malloc( (len+1) *sizeof *flag);

  31.     if(res == NULL || flag == NULL)
  32.         goto out;
  33.     else{
  34.         int index=0;
  35.         int ele[256] = {0};
  36.         for(index=0; index < len;index++)
  37.         { if(ele[ans[index]]>0)
  38.                 flag[index]=(len+'0');
  39.             else
  40.                flag[index]='0';
  41.             ele[ans[index]]++;
  42.         }
  43.         flag[index]=0;
  44.         zuhe(res,len,flag,ans);
  45.     }
  46. out:
  47.      free(res);
  48.      free(flag);
  49.      res = NULL;
  50. }
  51. void zuhe(char * ans, int len, char *p,char *pox)
  52. {
  53.     int ij;

  54.     if(len >0) {
  55.         for(ij =0 ; ij < length;ij++)
  56.             if(p[ij]=='0'|| length){
  57.                ans[length-len] =ij+'0';
  58.                if(TRUE == panduan(ans,strlen(ans)))
  59.                   zuhe(ans,len-1,p,pox);
  60.               ans[length-len]=0;
  61.           }
  62.     } else {
  63.           show(ans,pox);
  64.     }
  65. }
  66. int main()//该程序没有考虑到在待排序的字符中有相同的字符。
  67. {
  68.     char *p,*pans;

  69.     p = malloc(MAX * sizeof *p);
  70.     printf("please input the comnibation of the String\n");
  71.     pans = fgets(p,MAX,stdin);
  72.     if(NULL==pans)
  73.         goto out;
  74.     length = strlen(pans)-1;
  75.     Hzuhe(pans,length);//将获取的字符串传入Hzuhe

  76. out:
  77.     free(pans);
  78.     pans = p = NULL;
  79.     return 0;
  80. }




阅读(831) | 评论(0) | 转发(0) |
0

上一篇:递归之整数划分

下一篇:二叉树,哈夫曼

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