- 5
- 0
- 约2.07千字
- 约 4页
- 2017-05-29 发布于北京
- 举报
题目: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
您可能关注的文档
- 云白板使用手册demo.doc
- 云盘山隧道III级围岩开挖首件.doc
- 云管理让事情变的更轻松.docx
- 云药再引外援白药融资药妆.doc
- 云计算中存储虚拟化技术浅析.doc
- 云计算助推智慧城市的建设与发展.doc
- 云计算和大数据专项.doc
- 云计算数据中心调度算法研究.doc
- 云计算激变五种管理模式.doc
- 云计算的发展历程.doc
- 人教版九年级英语Unit 4曾害怕课件3a-4c.pdf
- 雅思口语考题回顾:朗阁海外考试研究中心2019年10月10日Part 1考题总结.pdf
- 2026届高三地理一轮复习课件小专题河流袭夺.pptx
- 【名师原创】复习专题5 三角函数 作者:合肥市第八中学 蒲荣飞名师工作室.docx
- 高中数学一轮复习 微专题2 抽象函数.docx
- 高中数学——复习专题4 空间向量与立体几何.docx
- 高中数学一轮复习 微专题3 空间几何体中的截面、轨迹问题.docx
- 高中数学一轮复习 微专题4 空间几何体的最值、范围问题.docx
- 导流洞施工质量通病防治手册.docx
- 江苏省徐州市第一中学、徐市第三中学等五校2026届高三上学期12月月考历史试题含答案.docx
原创力文档

文档评论(0)