2016-04-13 18 views
0

一連番号{0, 1, 2, 3, 4, 5, 6}を含む両端キューがあり、再帰を使用してこれらの数値のすべての組み合わせを作成しようとしています。デキューと再帰を使用してすべての可能な組み合わせを作成するC++

0 1 2 3 4 5 6 
0 1 2 3 4 5 
0 1 2 3 4 
0 1 2 3 
0 1 2 
0 1 
0 

理由ではありません。ここで

は私の現在のコード

void combination(vector<node> &comb, deque<node> &numbers) { 

    if (numbers.empty()) { 
     for (unsigned int i = 0; i < comb.size(); i++) { 
      cout << comb[i].id << " "; 
     } 
     cout << "\n"; 
     return; 
    } 

    comb.push_back(numbers.front()); 
    numbers.pop_front(); 
    combination(comb, numbers); 
    comb.pop_back(); 
    combination(comb, numbers); 
} 

は、私は紙の上でこれを駆け抜けてきたし、それが理にかなっているが、私はそれを実行すると、これが出力されています可能なすべての組み合わせを印刷しますか?

また、これは私が使用したいものです。数字と各組み合わせを含むベクトルを含むデュークです。あなたが参照渡しを使用している

+0

私は、これは学校のためであると仮定運動や他の学習経験ですか?それ以外の場合は、代わりに['std :: next_permutation'](http://en.cppreference.com/w/cpp/algorithm/next_permutation)を使用する必要があります。 –

+0

私はこの問題を解決するためにBranch and Boundメソッドを実装しています。だから、私は 'next_permutation'を使うことはできません –

+0

また、ここに投稿したコードはコンパイルされません。私は、関数が 'combination'の代わりに' permute'と呼ばれ、 'combination.push_back(...)'が 'comb.push_back(...)'でなければならないと思いますか? – CantrianBear

答えて

2

は、私はいくつかのマイナーな変更を行ったし、それが動作します

コード:ideoneのソリューションへ

#include <bits/stdc++.h> 
using namespace std; 

void combination(vector<int> comb, deque<int> numbers) { 

    if (numbers.empty()) { 
     for (unsigned int i = 0; i < comb.size(); i++) { 
      cout << comb[i] << " "; 
     } 
     cout << "\n"; 
     return; 
    } 

    comb.push_back(numbers.front()); 
    numbers.pop_front(); 
    combination(comb, numbers); 
    comb.pop_back(); 
    combination(comb, numbers); 
} 

int main() { 
    // your code goes here 
    vector<int> comb; 
    deque<int> numbers; 
    for(int i = 0;i < 7;i++) numbers.push_back(i); 
    combination(comb, numbers); 
    return 0; 
} 

リンク:http://ideone.com/vgukF3

+0

他の人が私の投稿にコメントしました。デキューだけが値渡しが必要ですが、これも良い答えです。 –

関連する問題