全部采用C++ vector的DFS实现
#include <bits/stdc++.h>
using namespace std;
vector<bool> used;//该题目中那些字母使用的情况(使用or未使用)
vector<char> chs;//该题目中出现的字母
vector<char> res;//存储结果
void dfs(int npos){//npos是当前枚举到的位数
if(npos==chs.size()){//当枚举到的位数超出了chs的最大下标,证明本次枚举完毕
for(auto i:res)cout<<i;//输出这个结果
cout<<endl;
return;
}
for(int i=0;i<chs.size();i++){//对于任意一位,他都有希望选择原题字母集的任意一个字母,所以遍历字母集
if(!used[i]){//如果第i个字母没有被使用,那么就放到第npos位
res[npos]=chs[i];//保存一下结果,npos是当前枚举的位数,对应的是res数组
used[i]=1;//标志一下,这一位字母用掉了
dfs(npos+1);//继续枚举下一位
used[i]=0;//刚刚从下一位枚举回来,说明这一位可以换字母了
//但是换字母之前要回溯,不然刚才用的那个字母别的位用不了
}
}
}
int main(){
string str;
cin>>str;
chs.resize(str.length());
used.resize(str.length());
res.resize(str.length());
for(int i=0;i<chs.size();i++)chs[i]=str[i];
dfs(0);//从第零位开始枚举
return 0;
}