#我们在DFS的搜索学习中涉及到了回溯的操作,那什么是回溯呢?
就是说我们在标记数组之后,我们进行解标记的操作,同时再次进入递归,出现新的情况的操作,这就叫做回溯操作。
如果现在有这样一道题:abc,如何输出他的全部排列方式,这时候我们就可以用回溯操作来解决这样的问题;
回溯与搜索:
分为以下几个步骤:
1.枚举方案数
2.标记-防止重复搜索
3.搜索当前层
4.进入下一层去搜索下个方案
5.回溯(解标记)
6.终止条件
第一步中有:枚举方案数
void dfs(int dep)
{
//1.枚举方案数
for(int i=0;i<s.size();i++)
{
第二步:标记-防止重复搜索
if(!vis[i]) {
vis[i]=1;
第三步:搜索当前层
//3.搜索当前层
ans[dep]=s[i];
第四步:进入下一层去搜索下个方案
//4.进入下一层去搜索下个方案
dfs(dep+1);
第五步:回溯(解标记)
//5.回溯
vis[i]=0;
第六步:终止条件
//6.终止条件
if(dep==s.size()+1){//前面s.size()已经搜索完了
//搜多少打印多少
for(int i=1;i<dep;i++)
cout<<ans[i];
cout<<endl;
return;
}
综合起来我们的回溯操作模板就是这样的:
#include<bits/stdc++.h>
using namespace std;
bool vis[101];
char ans[101];
string s;
void dfs(int dep)
{
//1.枚举方案数
for(int i=0;i<s.size();i++)
{
//6.终止条件
if(dep==s.size()+1){//前面s.size()已经搜索完了
//搜多少打印多少
for(int i=1;i<dep;i++)
cout<<ans[i];
cout<<endl;
return;
}
//2.标记-防止重复搜索
if(!vis[i]) {
vis[i]=1;
//3.搜索当前层
ans[dep]=s[i];
//4.进入下一层去搜索下个方案
dfs(dep+1);
//5.回溯
vis[i]=0;
}
}
}
int main()
{
cin>>s;
dfs(1);
return 0;
}
//谢谢大家的支持啦~~