您的位置:首页 > 编程语言 > C语言/C++

全排列算法递归实现 C++

2012-09-27 17:21 465 查看
尝试编写算法经典问题,全排列..目的只在练手

算法简介

设A是对集合S的求其全排列序列的运算(例A{a}={a},A{a,b}={ab,ba}...),则A对集合的运算可展开成如下递归式:

A{a1,a2,...,an}={{a1}A{a2,a3,...,an}+{a2}A{a1,a3,...,an}+...+{an}A{a1,a2,...,an-1}}

以包含五个元素的集合{a1,a2,a3,a4,a5}为例:

A{a1,a2,a3,a4,a5}={{a1}A{a2,a3,a4,a5}+{a2}A{a1,a3,a4,a5}+{a3}A{a1,a2,a4,a5}+

{a4}A{a1,a2,a3,a5}+{a5}A{a1,a2,a3,a4}}

(其中+运算可理解为集合的并,例如{a,b}+{c}={a,b,c};乘运算可理解为内积运算,例如{a}{b,c}={ab,ac})

故根据以上原理编写递归全排列算法

#include<iostream>
#include<list>

usingnamespacestd;
voidpermutation(strings,stringout,list<string>&sequence);
intmain()
{
strings;
cin>>s;//输入待排列字符串
intn=s.size();if(n==0)return0;
list<string>sequence;//保存全排列序列
stringout;
permutation(s,out,sequence);

cout<<"------------------------"<<endl;

for(list<string>::iteratorit=sequence.begin();it!=sequence.end();it++)
{
cout<<*it<<endl;

}

return0;
}
voidpermutation(strings,stringout,list<string>&sequence)
{

if(s.size()==1)//递归在序列长度为1时跳出
{
sequence.push_back(out+s);
return;
}
stringnewStr;//存储待排列的子集合
for(inti=0;i<s.size();i++)
{
if(i==0)
{
stringstr(s,1,s.size()-1);
newStr=str;
}
elseif(i==(s.size()-1))
{
stringstr(s,0,s.size()-1);
newStr=str;
}
else
{
stringstr1(s,0,i);

stringstr2(s,i+1,s.size()-i-1);

newStr=str1+str2;

}

stringstrx(s,i,1);
out.append(strx);//存储排列序列
permutation(newStr,out,sequence);//递归调用
string::iteratorit=out.end()-1;
out.erase(it);//清除序列最后一个元素
}

}

//-------------------------------procrustes---------2012.9.27


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: