//幂集对象
vector<vector<int>> pwSet{vector<int>()};
//全排列对象
vector<vector<int>> arrage{vector<int>{1}};
//采用增量穷举思想构造幂集
void getSet (int n) {
vector<vector<int>> tempPwSet;
// 每次循环以现有集合为基础新增集合
for (int i = 1; i <= n; ++i) {
tempPwSet = pwSet;
//对现有的每个集合新增同一个元素
for (auto itor = tempPwSet.begin();
itor != tempPwSet.end(); ++itor) {
itor->push_back(i);
pwSet.push_back(*itor);
}
}
}
void print_pwSet () {
for (auto vec : pwSet) {
cout << "{ ";
for (auto val : vec)
cout << val << " ";
cout << "}" << endl;
}
}
void print_arrage () {
for (auto vec : arrage) {
cout << "{ ";
for (auto val : vec)
cout << val << " ";
cout << "}" << endl;
}
}
void insert (vector<int> vec, int num, vector<vector<int>> &vvec)
{
//对排列vec的所有位置插入num,将得到的每一个新排列存储到vvec中
for (int i = 0; i < num; ++i) {
auto tempVec = vec;
auto itor = tempVec.begin() + i;
tempVec.insert(itor, num);
vvec.push_back(tempVec);
}
}
//采用增量思想构造全排列
void getArrage (int n) {
vector<vector<int>> tempArrage;
//对现有排列集合新增元素
for (int i = 2; i <= n; ++i) {
tempArrage.clear();
//对每个排列新增元素i
for (auto itor = arrage.begin(); itor != arrage.end(); ++itor)
insert(*itor, i, tempArrage);
//将最新得到的排列集合存储到arrage对象中
arrage = tempArrage;
}
}
// 递归版构造幂集(递归思想在蛮力法中的应用)
void insert2 (int i) {
vector<vector<int>> tempPwSet(pwSet);
for (auto itor = tempPwSet.begin(); itor != tempPwSet.end(); ++itor) {
itor->push_back(i);
pwSet.push_back(*itor);
}
}
void getSet2(int i, int n) {
if (i <= n) {
insert2(i);
// 求解小问题
getSet2(i+1, n);
}
}
// 递归版构造全排列(递归思想在蛮力法中的应用),构造i~n的全排列,因为初始集合有排列:1。所以从f(2,n)开始调用
void getArrage2 (int i, int n) {
if (i <= n) {
vector<vector<int>> tempArrage;
for (auto itor = arrage.begin();
itor != arrage.end(); ++itor)
insert(*itor, i, tempArrage);
arrage = tempArrage;
getArrage2(i+1, n);
}
}
蛮力法的基础工具——求幂集、全排列算法
最新推荐文章于 2024-01-14 11:16:15 发布