五个字符的可能组合输出及全排列.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
五个字符的可能组合输出及全排列

题目:a’,’b’,’c’,’d’,’e’,编程序输出这五个字符中的所有可能组合并输出。要求输出字符的顺序为从小到大,比如某种组合中有’a’,’b’和’c’,则’a’的输出一定要先于’b’,’b’的输出一定要先于’c’。 分析: 这实际上是一个树的按宽度优先遍历。首先把这五个字符用字符数组保存: int str[]=abcde; 每个字符后面的其他字符都是当前字符的子树。如图所示: 包含a的子集: ①长为1的:a; ②长为2的:ab,ac,ad,ae,为第一层和第二层的所有可能组合; ③长为3的: abc,abd,abe,acd,ace,ade,为第1、2和3层的所有可能组合; ④长为4的:abcd, abce,abde,acde,为第1、2、3和4层的所有可能组合; ⑤长为5的:abcde,为1~5层所有的可能组合 也就是说,含a的顺序子集(从小到大),就是从a出发,往下依次按层次访问下面各层所经历的路径上字符的排列。要输出这些子集,就是要输出这些字符排列。我们在访问的时候,按层次保存这些路径上的字符,并把它们输出即可。 同样的,含b的顺序子集,就是从b出发的子树,往下依次按层次访问下面各层所经历的路径上字符的排列。要输出这些子集,就是要输出这些字符排列。即上图中椭圆圈起来的部分。 含c的顺序子集,也相似,如下图椭圆圈起来的部分: 含d的顺序子集,即下图椭圆圈起来的部分: 含e的顺序子集,只有它自己。 据以上分析,可得知,这是一个递归的过程。随即设计出的算法代码如下: #includestdio.h #includestring.h void BFS(char s[], int n);//主要功能的实现函数声明:宽度优先遍历 char result[]=abcde;//保存子集的字符数组 int count=0; //子集个数计数器 int level=0; //保存当前路径长度 int main() { char str[]=abcde; int len =strlen(str); for (int i=0;i len;i++)//依次输出a,b,c,d,e为根的所有子树的遍历结果 { BFS(str+i, strlen(str+i)); } return 0; } //深度优先遍历算法。递归实现。 void BFS(char s[], int n) { if(s==NULL || n=0 ||strlen(s)==0) return; //参数合法性判断 result[level]=s[0]; //保存当前路径上最后一个点 result[level+1]=\0; //添加字符串结束符 level++; //路径长度加1 count++; //计数器加1 printf(%3d(%2d): %s\n,count,level,result);//输出当前路径上的字符串 for(int i=1;in;i++) //对所有子树执行本算法 { BFS(s+i,n-i); } level--; //回退。很重要!以便之后处理上一层其他子树 return ; } 上述方法也适合用于求数的组合。问题:如何求全排列? //输出指定字符集的全排列,C++ #includeiostream #includestring using std::cout; using std::endl; using std::string; void work(string rest, string now) { if(rest==) { cout now endl; }else { for (int i = 0; i rest.size(); ++i) {//每次从rest中提取一个字符加到now后,用作下次正在处理的字串 string next = now + rest[i]; string remaining = rest.substr(0,i) + rest.substr(i+1);//剩下的 work(remaining, next); } } } void pro(string pro1) { string pro2; work(pro1, pro2); } int main() { string s1(abcd); pro(s1); return 0; } a b c d e c d e d e e d e e e e a b c d e c d e d e e d e e e e a b c d e c d e d e e d e e e e a b c d e c d e d e e d

您可能关注的文档

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档