递归逐层确认即可
#include<iostream>
#include<string>
#include<vector>
using namespace std;
//相当于一根不完全的n叉树
void PaiLie(string str,vector<int> remain,int* seq,int length,int remove=-1,int layer=0){
if(layer!=0){
*(seq+layer-1) = remain.at(remove);//确认掉本层的字母
remain.erase(remain.begin()+remove);
}
if(layer==length){//生成了一个完整的序列
for(int i=0;i<length;i++)
cout<<str[seq[i]];
cout<<endl;
} else {//序列不完整,继续生成
int n = remain.size();
for(int i=0;i<n;i++){
PaiLie(str,remain,seq,length,i,layer+1);
}
}
}
int main(){//习题8.2 北京大学 输出字符串的全排列
//生成一个数字序列的全排列,再按照该排列打印字符串即可
//示例给出的打印顺序是123 132 213 231 312 321
string str;
while(cin>>str){
vector<int> id;
int n = str.size();
int* seq = (int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
id.push_back(i);
}
PaiLie(str,id,seq,n);
}
}

京公网安备 11010502036488号