From 5cef1729af707cf3a56d0c56bef602b014795548 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Thu, 11 Nov 2021 14:50:20 +0100 Subject: [PATCH] added slides on reines --- slides/cours_8.md | 10 +-- source_codes/recursivity/.gitignore | 1 + .../recursivity/rec_reines_no_alloc.c | 64 +++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 source_codes/recursivity/rec_reines_no_alloc.c diff --git a/slides/cours_8.md b/slides/cours_8.md index 0415fe5..654c3c5 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 bb7611b..26b8976 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 0000000..a1fd34b --- /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); +} -- GitLab