不定层数的循环参考了链接:https://blog.youkuaiyun.com/yoshubom/article/details/104124333,里面包含讲解。
应用场景:有一个里面是y个向量的向量,这里面的每个向量的元素的个数是不一样的。所以是两个维度,可以说是二维向量,一个维度是x,一个维度是y。y是循环的层数,x是每一个层循环的遍数。递归是在y维度上递归。
解决问题:全排列二维向量里的数。
下面的代码里,x_idx代表x维度的索引值,cur_y_idx代表当前y维度的索引值,max_y_idx代表y维度最大的索引值。
#include<vector>
#include<iostream>
std::vector<std::vector<int>> cycle(std::vector<std::vector<int>>& p, std::vector<std::vector<int>>& result, std::vector<int>& tmp, size_t cur_y_idx = 0)
{
size_t max_y_idx = p.size() - 1; // y维度最大的索引值,最底层循环的y维度的索引值
for (int x_idx = 0; x_idx < p[cur_y_idx].size(); ++x_idx)
{
tmp.emplace_back(p[cur_y_idx][x_idx]); // 暂存进tmp里,最后循环到最底层的时候放进result里。
if (cur_y_idx == max_y_idx)
{
// 这里已经循环到底层了,已经全排列了一个组合,放在tmp向量里,可以把tmp向量放进result向量。
result.emplace_back(tmp);
}
else
{
cycle(p, result, tmp, cur_y_idx + 1); // 如果没有循环到最底层,则递归
}
// 当循环到最底层把tmp向量放进result向量后,要把最后面的元素去掉,因为最底层的那个数已经放进result里了
//当递归回来的时候,也要把最后面的元素去掉,因为那个数已经在递归里用过了。你可以输出看看,想想。
tmp.pop_back();
}
return result;
}
void main()
{
std::vector<int> p1 = { 1, 2 };
std::vector<int> p2 = { 3, 4, 5 };
std::vector<int> p3 = { 6, 7, 8, 9 };
std::vector<std::vector<int>> p = { p1, p2, p3 };
size_t m = 1;
for (auto e : p)
m = m * e.size();
std::vector<std::vector<int>> result(m);
std::vector<int> tmp;
cycle(p, result, tmp);
for (auto e : result)
{
for (auto ee : e)
{
std::cout << ee << " ";
}
std::cout << std::endl;
}
system("pause");
}