今天在算法群中,了解到这一个问题,于是抱着学习的想法,结合了网上多篇文章,综合在了一起,才得出此文,十分感谢网上的好代码给了我基本思路才得以实现。
问题描述:
求n个元素幂集全排列 C++实现
输入例子:
3
1 2 3
输出例子:
1 2 3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2
2 1
1 3
3 1
1
2 3
3 2
2
3
算法思路
求子集然后将子集全排列即可,运用到了回溯法求子集以及库函数中的next_permutation()函数来加以实现全排列
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
//求n位数组 幂集全排列
void qingkong(int a[],int n)//清空数组元素
{
for (int i = 0; i < n;++i)
{
a[i] = 0;
}
}
void printfarray(int a[],int n)//打印数组函数
{
if(n==0)
{
return;
}
for (int i = 0 ; i < n ; ++i)
{
cout << a[i] << " ";
}
cout << endl;
}
void back(int a[],int b[],int c[],int i,int n)
{
if(i > n-1)//状态锁定 子集状态确定
{
int temp = 0;
for (int j = 0; j < n;++j)
{
if(b[j])//取出子集存在的元素
{
c[temp] = a[j];
temp++;
}
}
do //next_permutation(c,c+temp) 当temp=0时返回0 故所以要先执行一次 (进行全排列)
{
printfarray(c, temp);
} while (next_permutation(c, c + temp));
qingkong(c, temp);//完成一次子集全排列后必须清空数组内所有元素(置位0)否则数据将会出错
return;
}
b[i] = 1;//去第i个元素
back(a, b, c, i + 1, n);//处理下一个元素
b[i] = 0;//不取第i个元素
back(a, b, c, i + 1, n);//处理下一个元素
return;
}
int main()
{
int a[100] = {0};
int b[100] = {0};
int c[100] = {0};
int n;
cin >> n;
for (int i = 0; i < n;i++)
{
cin >> a[i];
}
back(a, b, c, 0, n);
return 0;
}
参考学习来源:
回溯法求子集
https://blog.csdn.net/ww1473345713/article/details/52092049
next_permutation()的学习与使用
https://www.cnblogs.com/weixq351/p/9497108.html