Skip to content
Snippets Groups Projects
Verified Commit 5cef1729 authored by orestis.malaspin's avatar orestis.malaspin
Browse files

added slides on reines

parent cf8fdbab
No related branches found
No related tags found
No related merge requests found
Pipeline #14865 passed
...@@ -181,7 +181,7 @@ void nb_sol(board, co, count); ...@@ -181,7 +181,7 @@ void nb_sol(board, co, count);
void placer_devant(board_ini, board, li, co); 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 ## Le calcul du nombre de solutions
...@@ -191,19 +191,20 @@ nbr_solutions(board, colonne, compteur) ...@@ -191,19 +191,20 @@ nbr_solutions(board, colonne, compteur)
// pour chaque ligne // pour chaque ligne
// si la case libre // si la case libre
// si la colonne < n - 1 // 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) // nbr_solutions(board, colonne, compteur)
// sinon // sinon
// on a posé la n-ème et on a gagné // on a posé la n-ème et on a gagné
// compteur += 1 // 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 ## Le calcul du nombre de solutions
```C ```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) placer_devant(old_board, board, ligne, colonne)
// board = copy(board); // board = copy(board);
// board est occupé à ligne/colonne // board est occupé à ligne/colonne
...@@ -211,3 +212,4 @@ placer_devant(old_board, board, ligne, colonne) ...@@ -211,3 +212,4 @@ placer_devant(old_board, board, ligne, colonne)
// suivantes sont mises à jour // suivantes sont mises à jour
``` ```
rec_fibonacci rec_fibonacci
rec_reines rec_reines
rec_reines_no_alloc
lissage lissage
rec_factorielle rec_factorielle
rec_pgcd rec_pgcd
......
// 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);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment