- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)