排列、子集代码
#include<bits/stdc++.h>
using namespace std;
int j = 0;
void perm(vector<int>ar, int n, int m, vector<vector<int>> &r)
{
if (n == m)
{
for (int i = 0; i < m; ++i)
{
r[j][i] = ar[i];
}
++j;
}
else
{
for (int i = n; i < m; ++i)
{
swap(ar[n], ar[i]);
perm(ar, n + 1, m, r);
swap(ar[n], ar[i]);
}
}
}
void sub(vector<int> ar, vector<int> br, int i, int length)
{
if (i == length)
{
//br[] 111 110 101 100 011 010 001 000
//子集 123 12 13 1 23 2 3 空集
for (int k = 0; k<length; ++k)
{
if (br[k] == 1)
{
cout << ar[k] << " ";
}
}
cout << endl;
}
else
{
br[i] = 1; //标1
sub(ar, br, i + 1, length); //产生分支
br[i] = 0; //标0
sub(ar, br, i + 1, length); //产生分支
}
}
int main()
{
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < arr.size(); ++i)
{
cin >> arr[i];
}
int len = 1;
for (int i = 1; i <= n; i++) //计算全排列的个数 n!
{
len *= i;
}
vector<vector<int>> re(len, vector<int>(n, -1));
perm(arr, 0, arr.size(), re);
for (int i = 0; i < re.size(); ++i)
{
for (int j = 0; j < n; ++j)
{
cout << re[i][j] << " ";
}
cout << endl;
}
vector<int> br(n);
sub(arr, br, 0, arr.size());
return 0;
}