#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> result;
vector<int> track;
// 路径:记录在 track 中
// 选择列表:nums 中不存在于 track 的那些元素
// 结束条件:nums 中的元素全都在 track 中出现
void backtrack(vector<int>& nums,vector<int>& track){
// 触发结束条件
if(track.size() == nums.size()){
result.push_back(track);
return;
}
for(int i=0; i<nums.size(); i++){
// 排除不合法的选择
//if(find(track.begin(),track.end(),nums[i]) != track.end()){
// continue;
//}
if(count(track.begin(),track.end(),nums[i]) > 0){
continue;
}
// 做选择
track.push_back(nums[i]);
// 进入下一层决策树
backtrack(nums, track);
// 取消选择
track.pop_back();
}
}
//写法二:使用 visitd 数组
void backtrack2(vector<int>& nums, vector<bool>& used){
// 触发结束条件
if(track.size() == nums.size()){
result.push_back(track);
return;
}
for(int i=0; i<nums.size(); i++){
// 排除不合法的选择
if(used[i] == true){ //track里已经收录的元素,直接跳过
continue;
}
used[i] = true;
// 做选择
track.push_back(nums[i]);
// 进入下一层决策树
backtrack2(nums, used);
// 取消选择
track.pop_back();
used[i] = false;
}
}
int main()
{
//result.clear();
//track.clear();
vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
vector<bool> used(nums.size(), false);
backtrack(nums, track);
//写法二对应的参数调用
//backtrack2(nums, used);
for( int i=0; i<result.size(); i++){
for(int j=0; j<result[0].size(); j++){
cout<<result[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
参考文献: