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
......@@ -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
```
rec_fibonacci
rec_reines
rec_reines_no_alloc
lissage
rec_factorielle
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