zoukankan      html  css  js  c++  java
  • 从每组中依次选择一个元素

    从每组中依次选择一个元素

             假设有N组元素,从N组中依次选取一个元素组成一个序列。假如N组元素的个数依次为A1,A2,…,AN,那么得到的序列数应该为A1*A2*…*AN。

             下面我们关注的是如何生成A1*A2*…*AN个序列。由于N是个变量,如果是用N个循环实现,只能针对特定的N个组的情况。并且如果N很大时,实现起来不现实。

             这里我们采用递归的方法来实现。

    // 递归实现
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    void foo(const vector<vector<string> >& src, int x, int n, int& total, vector<vector<string> >& obj, vector<string>& hod)
    {
        for (vector<string>::size_type i = 0; i != src[x-1].size(); ++i)
        {
            if (x == n)
            {
                hod.push_back(src[x-1][i]);
                ++total;
                obj.push_back(hod);
                hod.pop_back();
            }
            else
            {
                hod.push_back(src[x-1][i]);
                foo(src, x+1, n, total, obj, hod);
                hod.pop_back();
            }
        }
    }
    
    int main()
    {
        vector<vector<string> > src;
        vector<string> tmp;
        tmp.push_back("a");
        tmp.push_back("b");
        tmp.push_back("c");
        src.push_back(tmp);
        tmp.clear();
        tmp.push_back("h");
        tmp.push_back("i");
        tmp.push_back("j");
        src.push_back(tmp);
        tmp.clear();
        tmp.push_back("s");
        tmp.push_back("t");
        tmp.push_back("u");
        tmp.push_back("v");
        src.push_back(tmp);
        tmp.clear();
        tmp.push_back("x");
        tmp.push_back("y");
        tmp.push_back("z");
        src.push_back(tmp);
        tmp.clear();
        
        int total = 0;
        vector<vector<string> > obj;
        vector<string> hod;
        
        foo(src, 1, src.size(), total, obj, hod);
        
        for (vector<vector<string> >::size_type i = 0; i != obj.size(); ++i)
        {
            for (vector<string>::size_type j = 0; j != obj[i].size(); ++j)
            {
                cout << obj[i][j] << ' ';
            }
            cout << endl;
        }
        
        cout << total << endl;
        cout << obj.size() << endl;
        cout << hod.size() << endl;
        
        system("PAUSE");
        return 0;    
    }

  • 相关阅读:
    C#面向对象的基本原则
    EXTJS学习笔记:类似于Window的登录窗体
    c# 类似于QQ表情弹出框功能的二种实现方法
    EXTJS学习笔记:grid之分组实现groupingview
    RibbonBar屏蔽右键
    webservice安全性浅谈
    js生成二维码以及插入图片
    c++之const解惑
    最短路径连接表形式
    深入理解c++之动态内存和指针
  • 原文地址:https://www.cnblogs.com/unixfy/p/3150572.html
Copyright © 2011-2022 走看看