# 46. Permutations
###### tags: `C++` `LeetCode` `Medium` `Backtracking`
## Notes
```
Backtrack
def backtrack(route, decisions)
if terminal condition satisfied
result.add(route)
return
for decision in disision list
make decision
backtrack(route, decision lists)
withdraw decision
```
## Code
```c++
#include <vector>
#include "cout.h"
vector<vector<int>> permute(vector<int>& nums);
vector<vector<int>> permuteBacktrack(vector<int>& nums, vector<int> used, vector<int> result, vector<vector<int>> &results);
int main()
{
vector<int> v = {1, 2, 3};
coutVectorVector(permute(v));
return 0;
}
vector<vector<int>> permute(vector<int>& nums)
{
vector<vector<int>> results;
vector<int> result;
vector<int> used;
int len = nums.size();
used.assign(len, 0);
results = permuteBacktrack(nums, used, result, results);
return results;
}
vector<vector<int>> permuteBacktrack(vector<int>& nums, vector<int> used, vector<int> result, vector<vector<int>> &results)
{
int len = nums.size();
if(result.size() == nums.size()) results.push_back(result);
for(int i = 0; i < len; i++)
{
if(used[i] == 0)
{
used[i] = 1;
result.push_back(nums[i]);
permuteBacktrack(nums, used, result, results);
used[i] = 0;
result.pop_back();
}
}
return results;
}
```