算法刷题6 (C++)回溯算法(DFS)

回溯算法框架思路

回溯算法———一个决策树的遍历过程(前序遍历和后序遍历)

明确三点:

   (1)路径:已经做出的选择。

(2)选择列表:当前可做的选择

 (3)结束条件:决策树底层无法遍历选择的条件

result=[]

<>  backtrack(路径,选择列表)

     if 满足结束条件{
        result.add(路径);
        return ;

     }

    for  选择 in 选择列表
        {
           做选择
           backtrack(路径,选择列表)
            撤销选择

       }

        

c++ 全排列问题

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int> > res;


// vector<vector<int>> res = new LinkedList()
void backtrack(vector<int> nums,vector<int> track)
{
    /*满足结束条件*/
    if (track.size()==nums.size())
    {
        res.push_back(track);
        return ;
    }

    // for 选择  in 选择列表
    //    做出选择
    //    backtrack(路径,选择列表)
    //    撤销选择
    for(int i=0;i<nums.size();i++)
    {
        //如果有则
        
        if( find(track.begin(),track.end(),nums[i])!=track.end()) //  做选择
        {
            continue;
        }
        track.push_back(nums[i]); //  做选择                      push_back向函数尾部增加一个元素
        backtrack(nums,track); //  回溯函数
        track.pop_back();   //     撤销选择                        pop_back删除最后一个元素
    }
}

vector<vector<int> > permute(vector<int> nums)
{
   vector<int> track;
   backtrack(nums,track);
   return res;
}



int main(int argc ,char * argv[])
{

vector<int> nums;
for(int i=0;i<3;i++ )
{
    nums.push_back(i);
}

   res =  permute(nums);
   for(int i=0;i<res.size();i++)
   {
    for(int j =0 ;j<res[i].size();j++)
    {
        cout<<res[i][j] ;
    }
     cout<<endl;
   }
  

    return 0;
}

猜你喜欢

转载自blog.csdn.net/L1153413073/article/details/126575350