回溯算法框架思路
回溯算法———一个决策树的遍历过程(前序遍历和后序遍历)
明确三点:
(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;
}