diff --git a/slides/cours_8.md b/slides/cours_8.md index 0415fe57dc017641a49ed4e0f651b70f0422a0fc..654c3c55175080ed9aa3d6efd0745f1e82ca0c6b 100644 --- a/slides/cours_8.md +++ b/slides/cours_8.md @@ -181,7 +181,7 @@ void nb_sol(board, co, count); void placer_devant(board_ini, board, li, co); ``` -# Le code du problème des 8 reines (1/N) +# Le code du problème des 8 reines (2/N) ## Le calcul du nombre de solutions @@ -191,19 +191,20 @@ nbr_solutions(board, colonne, compteur) // pour chaque ligne // si la case libre // si la colonne < n - 1 - // poser une reine et mettre à jour le tableau + // créer un nouveau board, poser une reine + // et mettre à jour le tableau // nbr_solutions(board, colonne, compteur) // sinon // on a posé la n-ème et on a gagné // compteur += 1 ``` -# Le code du problème des 8 reines (2/N) +# Le code du problème des 8 reines (3/N) ## Le calcul du nombre de solutions ```C -// Calcule le nombre de solutions au problème des <n> reines +// Copier board, placer une reine et mettre à jour placer_devant(old_board, board, ligne, colonne) // board = copy(board); // board est occupé à ligne/colonne @@ -211,3 +212,4 @@ placer_devant(old_board, board, ligne, colonne) // suivantes sont mises à jour ``` + diff --git a/source_codes/recursivity/.gitignore b/source_codes/recursivity/.gitignore index bb7611bb8a5ed3c17bb1a2d73d12911687074756..26b8976e896cb74de02e2195fa0f46461fe78fed 100644 --- a/source_codes/recursivity/.gitignore +++ b/source_codes/recursivity/.gitignore @@ -1,5 +1,6 @@ rec_fibonacci rec_reines +rec_reines_no_alloc lissage rec_factorielle rec_pgcd diff --git a/source_codes/recursivity/rec_reines_no_alloc.c b/source_codes/recursivity/rec_reines_no_alloc.c new file mode 100644 index 0000000000000000000000000000000000000000..a1fd34b96212b05544f756bdcfc921afc7088db6 --- /dev/null +++ b/source_codes/recursivity/rec_reines_no_alloc.c @@ -0,0 +1,64 @@ +// Problème des N-reines +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> + +void board_ini(int n, bool board[n][n], bool val) { + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + board[i][j] = val; + } + } +} +// Copie les valeurs de la board_ini dans board +void copy(int n, bool board_ini[n][n], bool board[n][n]) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + board[i][j] = board_ini[i][j]; + } + } +} + +// Retourne une copie du tableau <board> complété avec les positions +// prises sur la droite droite par une reine placée en <board(li,co)> +void prises_devant( + int n, bool board_ini[n][n], bool board[n][n], int li, int co) { + copy(n, board_ini, board); + board[li][co] = false; // position de la reine + for (int j = 1; j < n - co; j++) { + // horizontale et diagonales à droite de la reine + if (j <= li) { + board[li - j][co + j] = false; + } + board[li][co + j] = false; + if (li + j < n) { + board[li + j][co + j] = false; + } + } +} + +// Calcule le nombre de solutions au problème des <N> reines +void nb_sol(int n, bool board_ini[n][n], int co, int *ptr_cpt) { + for (int li = 0; li < n; li++) { + if (board_ini[li][co]) { + if (co < n - 1) { + bool board[n][n]; + prises_devant(n, board_ini, board, li, co); + nb_sol(n, board, co + 1, ptr_cpt); + } else { + *ptr_cpt = (*ptr_cpt) + 1; + } + } + } +} + +void main() { + int n = 8; + // échiquier où placer les reines + bool board[n][n]; + board_ini(n, board, true); + // compteur du nombre de solutions au problème des <N> reines + int cpt = 0; + nb_sol(n, board, 0, &cpt); + printf("Nombre de solutions: %d\n", cpt); +}