#include<iostream>
#include<vector>
using namespace std;
//打印
void Print(vector<int>v)
{
for (auto &x : v)
{
cout <<x<< " ";
}
cout << endl;
}
//生成
void Creat(vector<int>&v,int n)
{
for (int i = 0; i < n; ++i)
{
v.push_back(i + 1);
}
}
void perm(vector<int>&v, int level)
{
if (level == v.size())
{
Print(v);
}
for (int i = level; i < v.size(); ++i)
{
int temp = v[level];
v[level] = v[i];
v[i] = temp;
perm(v,level + 1);
//此时数组已经被改变,而递归其他子节点时,我们需要使用的是父节点,所以要把值改变回去
temp = v[i];
v[i] = v[level];
v[level] = temp;
}
}
int main()
{
vector<int>v;
int n;
cout<<"请输入n的值:"<<endl;
cin >> n;
Creat(v, n);
//Print(v);//测试数组是否生成成功
perm(v,0);
system("pause");
return 0;
}
实现原理
递归:用搜索树的方式去描述
回溯算法
能用回溯算法解决的问题都可以抽象为一个树形结构。
void backtrack(参数)
{
if(终止条件)
接受结果;
return;
for(处理节点)
{
递归;//递归到return,递归结束,执行回溯语句
回溯;
}
}
组合是无序的,排列是有序的。