#我们在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;}
//谢谢大家的支持啦~~