0

これは私が立ち往生している小さな部分であり、はるかに大きな課題の一部です。

次のような2Dベクトルがあります。

v1: 0 1 2 3 4  
v2: 0 1 2  
v3: 0 1 2 3 4  
v4: 0 1 2 3  
v5: 0 1 2 3 4  

(各行はベクトルです)

各行から1つの要素を選択して、すべての順列を見つける必要があります。誰かが指摘したように、これはデカルト積になります。
ループを使用してみましたが、それは一方向でしか機能しません(かなりの数の順列が欠落しています)
next_permutationも調べましたが、これを2Dベクトルに適用できるかどうかはわかりません。

さらに、行数は静的ではないため、条件に応じて行数が増減する可能性があるため、5つのループをネストすることはできません。

これを行う方法はありますか?

4

2 に答える 2

2

考えられる答えを 1 つだけ書きます。これはあまり効率的ではありませんが、使用できるはずです。

(あなたの例では)すべての5要素グループが必要であると仮定していることに注意してください。最初の要素はv1から、2番目の要素はv2から、3番目はv3から、などです。

void gen_all (
    vector<vector<int> > & output_perms,
    vector<vector<int> > const & input,
    vector<int> & cur_perm,
    unsigned cur_row = 0
)
{
  if (cur_row >= input.size())
  {
    // This is where you have found a new permutation.
    // Do whatever you want with it.
    output_perms.push_back (cur_perm);
    return;
  }

  for (unsigned i = 0; i < input[cur_row].size(); ++i)
  {
    cur_perm.push_back (input[cur_row][i]);
    gen_all (output_perms, input, cur_perm, cur_row + 1);
    cur_perm.pop_back ();
  }
}

上記の関数を次のように呼び出しvます: ( が元のセットを保持していると仮定します。)

vector<vector<int> > output;
vector<int> temp;
gen_all (output, v, temp);

前に言ったように、はるかに効率的で洗練された方法があり、上記のコードはコンパイルさえできないかもしれません (私はここに書きました)。

于 2012-06-18T22:18:52.563 に答える
1

std::next_permutation1 セットのイテレータでのみ機能します。ただし、静的メモリは保持されません。すべてイテレータの現在の状態に基づいています。つまり、一度に複数のベクターで使用できます。構造全体を一度に並べ替えようとしないでください。

于 2012-06-18T22:11:50.313 に答える