ioCode
N-reines
Backtracking • Exercices 2A
On considère un échiquier carré de taille n×n (par exemple 4×4) sur lequel on souhaite placer des reines.
- L'objectif est de placer n reines sur l'échiquier de façon à ce qu'aucune d'entre elles ne puisse en attaquer une autre.
- Deux reines s'attaquent si elles sont situées sur la même ligne, la même colonne, ou la même diagonale.
- En OCaml, on représente la position des reines sur l'échiquier par une liste de coordonnées
(int * int) list, où chaque tuple(ligne, colonne)indique l'emplacement d'une reine. La ligne supérieure correspond à l'indice 0.
Le but est d'écrire une fonction qui renvoie toutes les configurations possibles pour placer n reines en toute sécurité sur l'échiquier.
- Écrire une fonction1IndiceComparer les coordonnées des lignes et des colonnes, puis détecter les lignes ou colonnes identiques. Les diagonales se compare en prenant le différence des coordonnées en valeur absolue.
attacks : int * int -> int * int -> boolqui renvoietruesi deux reines s'attaquent etfalsesinon. Par exempleattacks (0, 0) (0, 1)renvoietrue. - Écrire une fonction2IndiceAppliquer la fonction attacks à chaque élément de la liste à l'aide de List.exists pour vérifier la sécurité.
is_safe : (int * int) list -> int * int -> boolqui renvoietruesi une case est sûre par rapport à une liste de reines déjà placées. Par exempleis_safe [(1, 1)] (0, 0)renvoiefalse. - Écrire une fonction3IndiceVérifier la taille de la liste puis utiliser une récursion pour garantir la sécurité mutuelle et les limites du plateau.
validate_solution : int -> (int * int) list -> boolqui renvoietruesi une liste de reines constitue une solution valide sur un plateau de taillenxn. Par exemplevalidate_solution 4 [(0, 0); (1, 2); (2, 0); (3, 2)]renvoiefalse. - Écrire une fonction4IndiceImplémenter une récursion par backtracking sur les lignes et les colonnes pour accumuler progressivement toutes les solutions.
solve_n_queens : int -> (int * int) list listqui renvoie toutes les solutions possibles du problème des N reines. Par exemplesolve_n_queens 4renvoie[[(0, 1); (1, 3); (2, 0); (3, 2)]; [(0, 2); (1, 0); (2, 3); (3, 1)]].
Langage
Console initialisée. En attente de l'interpréteur...