という行列を生成する再帰関数があり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
は、 の後に埋められていない行について、埋められる可能性のある更新された (残りの)ですcolIndex
。lights
これは再帰的に渡され、次の列に入力されます。
この関数が行うことになっているのは、 のそれぞれについてすべての行列を見つけること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);
}