エンジェル隊組み合わせ

今日もドラマCDを聞きながら考えた。
エンジェル隊の組み合わせは何通りあるのだろうか?」
4期になってからは全員で出ることが多かったけど、昔は2〜3人での絡みが多かったはず。ということで、エンジェル隊のそれぞれが絡んだらどういうシチュエーションになるか想像してみることにした。が、一体どのくらいのパターンがあるのだろうか?というプログラムを書くことにした。まあ5人くらいなら樹形図書けばいいんだけどね・・・

アルゴリズムは超簡単。

1 ┬ 2 ┬ 3
  │   ├ 4
  │   └ 5
  ├ 3 ┬ 4
  │   └ 5
  └ 4 ─ 5

2 ┬ 3 ┬ 4
  │   └ 5
  └ 4 ─ 5

3 ─ 4 ─ 5

こんな樹形図を書くのと全く同じアルゴリズム

// combi.cpp
#include <iostream>
#include <string>
#include <vector>

using namespace std;

// enumeration (recursive)
void enum_combi_rec(vector<int> &this_combi, 
                    vector< vector < int > > &all_combi, 
                    const int n, const int depth, const int k, const int N)
{
     this_combi[depth] = n;
     if(depth == k-1){
          all_combi.push_back(this_combi);
          return;
     }
     else{
          for(int i=n+1; i<N; i++){
               enum_combi_rec(this_combi, all_combi, i, depth+1, k, N);
          }
     }
}
// enumeration
void enum_combi(vector< vector < int > > &all_combi, const int k, const int N)
{
     vector<int> c(k);
     for(int i=0; i<N; i++){
          enum_combi_rec(c, all_combi, i, 0, k, N);
     }
}
// main
int main(const int argc, const char ** const argv)
{
     const int N = argc-1;
     vector<string> elem;
     for(int i=1; i<argc; i++){
          elem.push_back(argv[i]);
     }
     for(int i=1; i<=N; i++){
          vector< vector < int > > all;
          enum_combi(all, i, N);
          cout << "-------- " << N << "_C_" << i
               << " (" << all.size() << " combinations)   --------" << endl;
          for(int j=0; (unsigned)j<all.size(); j++){
               for(int k=0; (unsigned)k<all[j].size(); k++){
                    cout << all[j][k] << " ";
               }
               cout << endl;
          }
     }
     return 0;
}
% ./combi ミルフィー ランファ ミント フォルテ ヴァニラ
-------- 5_C_1 (5 combinations)   --------
ミルフィー 
ランファ 
ミント 
フォルテ 
ヴァニラ 
-------- 5_C_2 (10 combinations)   --------
ミルフィー ランファ 
ミルフィー ミント 
ミルフィー フォルテ 
ミルフィー ヴァニラ 
ランファ ミント 
ランファ フォルテ 
ランファ ヴァニラ 
ミント フォルテ 
ミント ヴァニラ 
フォルテ ヴァニラ 
-------- 5_C_3 (10 combinations)   --------
ミルフィー ランファ ミント 
ミルフィー ランファ フォルテ 
ミルフィー ランファ ヴァニラ 
ミルフィー ミント フォルテ 
ミルフィー ミント ヴァニラ 
ミルフィー フォルテ ヴァニラ 
ランファ ミント フォルテ 
ランファ ミント ヴァニラ 
ランファ フォルテ ヴァニラ 
ミント フォルテ ヴァニラ 
-------- 5_C_4 (5 combinations)   --------
ミルフィー ランファ ミント フォルテ 
ミルフィー ランファ ミント ヴァニラ 
ミルフィー ランファ フォルテ ヴァニラ 
ミルフィー ミント フォルテ ヴァニラ 
ランファ ミント フォルテ ヴァニラ 
-------- 5_C_5 (1 combinations)   --------
ミルフィー ランファ ミント フォルテ ヴァニラ 

合計31通りの組み合わせかあ・・・なんか一日一ネタやれって言ってるようだなあ・・・。