算法1
dfs
语法和递归思想学习
res+=a[i];//拼接字符串,string对+=进行了重载
甚至可以拼接字符串,如res+=s;s就被加入到了res的后面,赋值给res
C++ 代码
//抄的代码,学习语法和思想
#include<iostream>
using namespace std;
const int N=7;
bool st[N];
string a;
string res;//一个递归分支结束后输出的结果
//3. 为何不需要多个 res 副本?(ai的解释)
//回溯的高效性:通过修改同一内存区域(全局 res)并即时恢复状态,避免了频繁创建/销毁字符串的开销。
//递归栈的独立性:虽然递归调用是多层的,但每个层的操作都严格遵循后进先出(LIFO)的顺序,确保回溯时状态正确。
void dfs(string a,int cnt){
if(cnt==a.size()){
cout<<res<<endl;
return ;
}
for(int i=0;i<a.size();i++){
if(!st[i]){
st[i]=true;
res+=a[i];
dfs(a,cnt + 1 );//递归,先执行,深度搜索之后才回溯
st[i] = false;//回溯
res.pop_back();
}
}
}
int main(){
cin>>a;
dfs(a,0);
return 0;
}
算法2(独立完成)
next_permutation
C++ 代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
//不确定next_permutation能不能对string
//所以把s转化为字符串数组
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
string s;
cin>>s;
char a[s.size()];
for(int i=0;i<s.size();i++){
a[i]=s[i];
}
for(int i=0;i<s.size();i++){
cout<<a[i];
}
cout<<endl;
while(next_permutation(a,a+s.size())){
for(int i=0;i<s.size();i++){
cout<<a[i];
}
cout<<endl;
}
return 0;
}