1

という行列を生成する再帰関数がありlightsます。

この関数は で呼び出されlight_and_colorます。

light_col_permutationで呼び出される はlights、int のベクトルのベクトルのベクトルを返します。

for(vector<vector<int> > aa:light_col_permutations(rowSums, colSums, colIndex))したがって、コードのループではaa、ベクトルのペアが得られます。

aa[0]index の行列の行に入る可能性のある値ですcolIndex

aa[1]rowSumsは、 の後に埋められていない行について、埋められる可能性のある更新された (残りの)ですcolIndexlightsこれは再帰的に渡され、次の列に入力されます。

この関数が行うことになっているのは、 のそれぞれについてすべての行列を見つけることaaですlight_col_permutations

コードの基本ケースでは、そのようなマトリックスを 1 つだけ見つけて終了しreturnます。

どうすればそれらすべてを生成できますか?

次のコードは、再帰の構造を確認できるように簡略化したものです。不明な点があればお知らせください。(プログラム全体で約800行ですが、要望があれば載せます)

void lights(vector<int>& rowSums, vector<int>& colSums, int colIndex, matrix_c mc) {
    if(colIndex == mc.r) {
        mc.print_matrix();
    }
    for(vector<vector<int> > aa:light_col_permutations(rowSums, colSums, colIndex)) {
        mc.row_assign(colIndex, aa[0]);
        mc.newRowSum = aa[1];

        lights(mc.newRowSum, colSums, colIndex+1, mc);
    }
}

void light_and_color(int r, int n, int color, string filename) {
        matrix_c mc(r, n); //zero matrix of size (r) X (r)
        //here I get rowSums and colSums, but I omitted them
        lights(rowSums, colSums, 0, mc);
}
4

0 に答える 0