前言:
什么是全排列:
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
举例:
arr[3]={1,2,3}
那么它的全排列为:
123 132 213 231 312 321
算法描述:
采用增量蛮力法来解决全排列问题,为了更加形象的表达,采用vector容器的插入方法求全排列
不太了解vector容器的可以点这里vector容器简单上手。
代码流程图:
容器插入元素时,对1而言,插入2,就有2个插入位置,对12和21而言,插入3,就有3个插入位置,代码中用迭代器获取到第一个元素的位置,然后这个迭代器的指向后移,指向新的插入位置。
代码详细:
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
//增量蛮力法求全排列
vector<vector<int>>ps;//存放全排列
vector<vector<int>> ps1;//临时存放子排列
void Insert(vector<int>s,int i)//新元素的插入方法
{
vector<int>s1;//临时容器接收子容器,插入时不破坏原有子容器
for (int j = 0; j < i; j++)//插入元素几,就有几个位置
{
s1 = s;
auto it = s1.begin()+j;//获取元素要插入的位置
s1.insert(it, i);
ps1.push_back(s1);//产生的新子容器放入临时容器ps1中
}
}
void zen()
{
vector<int> s;
s.push_back(1);
ps.push_back(s);//整型容器全排列( (1))中放入了一个整型容器(1)
cout << "请输入n的值:" << endl;
int n = 0;
cin >> n;//n的全排列
cout << "全排列为:" << endl;
//开始插入
for (int i = 2; i <= n; i++)//从2开始插入,1已经存在了
{
ps1.clear();//每次插入前将临时存放容器ps1清空
//将全排列ps容器中的所有子容器都插上新元素
for (auto it = ps.begin(); it != ps.end(); it++)
{
Insert(*it, i);//给这个子容器插上新元素
}
ps = ps1;//临时存放的ps1容器覆盖ps全排列容器
}
//输出
for (auto it = ps.begin(); it != ps.end(); it++)
{
for (auto sit = (*it).begin(); sit != (*it).end(); sit++)
{
cout << *sit;
}
cout << endl;
}
}
int main()
{
zen();
return 0;
}