C++ 递归实现不定层数的动态循环,应用例子:二维向量,全排列不定个数的向量里的数

不定层数的循环参考了链接:https://blog.csdn.net/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");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值