全排列就是所有元素所有可能的排列
【例】
1~3 的全排列:1 2 3, 1 3 2 , 2 1 3, 2 3 1, 3 1 2, 3 2 1
1,2,2的全排列:1 2 2, 2 1 2, 2 2 1
先考虑无重复元素的时候:
直接在SumK上修改的,具体看代码:
#include <iostream>
#include <vector>
using namespace std;
//标记第i位有无存在于排列中
int b[100] = {0};
void Permutate(vector<vector<int>>& res, vector<int>& a, vector<int>& v, int cur) {
//排列中放满所有元素结束
if(v.size() == a.size()) {
res.push_back(v);
return;
}
for(int i = 0; i < a.size(); i++) {
if (b[i] == 0) {
//放入排列
b[i] = 1;
v.push_back(a[i]);
Permutate(res, a, v, i+1);
//移出排列
v.pop_back();
b[i] = 0;
}
}
}
int main(){
vector<int> a;
for (int i = 3; i >= 0; i--) {
a.push_back(i);
}
vector<int> v;
vector<vector<int>> res;
Permutate(res, a, v, 0);
cout << res.size() << endl;
for(int i = 0; i < res.size(); i++) {
cout << "【 ";
for(int j = 0; j < res[i].size(); j++) {
cout << res[i][j] << " ";
}
cout << "】" << endl;
}
}
输出:
24
【 3 2 1 0 】
【 3 2 0 1 】
【 3 1 2 0 】
【 3 1 0 2 】
【 3 0 2 1 】
【 3 0 1 2 】
【 2 3 1 0 】
【 2 3 0 1 】
【 2 1 3 0 】
【 2 1 0 3 】
【 2 0 3 1 】
【 2 0 1 3 】
【 1 3 2 0 】
【 1 3 0 2 】
【 1 2 3 0 】
【 1 2 0 3 】
【 1 0 3 2 】
【 1 0 2 3 】
【 0 3 2 1 】
【 0 3 1 2 】
【 0 2 3 1 】
【 0 2 1 3 】
【 0 1 3 2 】
【 0 1 2 3 】