前言:
全排列问题会在各个问题中用到,你是否还在为全排列问题而发愁呢?下面我将清晰地讲解全排列的问题求解。
题解:
首先对1,2,3进行全排列,我们会得到6个序列。
分别为1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2, 3 2 1
我们对这个例子可以看出,我们可以用递归来求解。
首先把每个数和第一个数交换然后对后面的n-1个元素进行全排列,如此递归下去,一直到进行全排列的元素数为1,然后退出递归。
代码注释很详细,所以题解不再说太多。
代码:
#include<iostream>
#include<vector>
using namespace std;
int sum = 0; //统计有几个全排列序列
void print(vector<int> ve, int n)//把向量的全排列序列打印
{
for (int i = 0; i <= n; i++)
{
cout << ve[i] << "\t";
}
cout << endl;
}
void swap(vector<int>& ve, int p, int q)//交换向量中的第p个和第q个元素
{
int temp = ve[p];
ve[p] = ve[q];
ve[q] = temp;
}
void perm(vector<int> ve, int p, int q)//从下标为p到q进行全排列
{
if (p == q)//递归出口,进行全排列的元素数为1个是退出,并打印
{
print(ve, q);
sum++;
}
else
{
int i;
for (i = p; i <= q; i++) //遍历所有元素
{
swap(ve, p, i); //把各个元素提到第一位
perm(ve, p + 1, q); //把后面的下标从p+1到q的向量进行全排列
swap(ve, p, i); //把元素再交换回来,然后进行下次遍历
}
}
}
int main()
{
vector<int> ve;
int i, k, n;
cout << "请输入对几个数进行全排列" << endl;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> k;
ve.push_back(k);
}
perm(ve, 0, n - 1);
cout <<"一个的全排列的序列数为:"<< sum<<"个" << endl;
return 0;
}
结果展示:
注意:
向量作为参数进行传递,传递方式为值传递,不像数组那样是指针传递,所以swap函数中的参数一定要对向量ve进行引用,否则,交换则无意义。