Arrange and Combine

Combine

void combine_traverse(const std::list<int> left, const std::list<int> right, std::list<std::list<int> >& output) {
    std::list<int>::const_iterator vBegIt, vEndIt ;
    vBegIt = right.begin() ;
    vEndIt = right.end() ;
    std::list<int> r = right ;
    for(; vBegIt != vEndIt; ++vBegIt) {
        std::list<int> l = left ;
        r.pop_front() ;
        l.push_back(*vBegIt) ;
        combine_traverse(l, r, output) ;
        output.push_back(l) ;
    }
}

Arrange

void arrange_traverse(const std::list<int> left, const std::list<int> right, std::list<std::list<int> >& output) {
    std::list<int>::const_iterator vBegIt, vEndIt ;
    vBegIt = right.begin() ;
    vEndIt = right.end() ;

    size_t curSize = 0 ;
    for(; vBegIt != vEndIt; ++vBegIt,++curSize) {
        std::list<int> l = left ;
        l.push_back(*vBegIt) ;

        std::list<int> r = right ;
        std::list<int>::iterator it = r.begin() ;
        for(size_t i = 0 ; i < curSize; ++i) {
            ++it ;
        }
        r.erase(it) ;

        arrange_traverse(l, r, output) ;
    }
    if(right.size() == 0) {
        output.push_back(left) ;
    }
}

Test

int main() {
    std::list<int> left, right;
    right.push_back(1) ;
    right.push_back(2) ;
    right.push_back(3) ;
    std::list<std::list<int> > output ;
    combine_traverse(left, right, output) ;
    // arrange_traverse(left, right, output) ;
    std::list<std::list<int> >::iterator outBegIt, outEndIt ;
    outBegIt = output.begin() ;
    outEndIt = output.end() ;
    std::list<int>::iterator inBegIt, inEndIt ;
    for(; outBegIt != outEndIt; ++outBegIt) {
        inBegIt = (*outBegIt).begin() ;
        inEndIt = (*outBegIt).end() ;
        for(; inBegIt != inEndIt; ++inBegIt) {
            std::cout << *inBegIt << "\t" ;
        }
        std::cout << std::endl ;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容