TD 3 : Récursivité (suite)
Les méthodes de tous les exercices doivent être écrites
dans les classes fournies en annexe
(telecharger ces classes)
.
Le problème des reines est un classique qui illustre un certain type
d'algorithme appelé algorithme à rétro-parcours (backtracking en anglais, qui veut dire revenir sur ses pas). Etant
donné un échiquier comprenant n × n cases (n ³ 1), on
désire y placer n reines de telle sorte qu'aucune reine ne soit en
prises avec d'autres, en suivant les déplacements autorisés dans le jeu
d'échecs. On dit alors que les reines sont libres (on rappelle que
dans le jeu d'échecs, les reines se déplacent d'un nombre quelconque de
cases sur les lignes, les colonnes et les diagonales).
EXERCICE 1
Donnez deux valeurs de n pour lesquelles il n'y a pas de solution au
problème des reines.
L'algorithme qui cherche une solution procède par énumération de
toutes les possibilités. On remarque que chaque colonne de l'échiquier
doit nécessairement contenir une et une seule reine. En décidant qu'on
numérote les lignes, les colonnes et les reines de l'échiquier de 0
à n-1, on peut reformuler le problème de la façon suivante :
étant donné un échiquier de taille n (donc de n × n cases),
calculer une solution, soit un n-uplet (l0,l1,...,ln-1)
tel que pour tout i, 0 £ i £ n-1, la reine i soit en ligne
li et en colonne i, de telle façon qu'aucune reine ne soit en
prise avec aucune autre. Par exemple, en donnant à la case en haut à
gauche de l'échiquier les coordonnées (0,0), les quintuplets
(1,4,2,0,3) et (3,1,4,2,0) sont des solutions pour n = 5.
Pour trouver une solution au problème des reines, on commence par placer la
reine 0 en ligne 0 et en colonne 0. On cherche ensuite une ligne
pour la reine 1 qui est en colonne 1, et ainsi de suite. Lors du
placement de la reine k, si aucune ligne ne convient, on revient à la
reine k-1 à qui on essaie d'attribuer une nouvelle ligne. On revient en arrière pour modifier un placement déjà effectué, d'où
le nom d'algorithme avec retour en arrière (ou backtracking).
EXERCICE 2
Déduisez des indications précédentes un algorithme récursif informel
qui calcule une solution et illustrez son fonctionnement en donnant toutes
les solutions pour n = 4. Appliquez cet algorithme aux deux valeurs de
n pour lesquelles il n'y a pas de solution et essayez d'en déduire un
critère général indiquant l'absence de solution au problème des
reines.
A un instant donné du déroulement de l'algorithme précédent,
l'échiquier contient k reines et peut être représenté par le
k-uplet (l0,l1,...,lk-1) où li est la ligne de la reine
i qui se trouve en colonne i. Aux différents états de
l'échiquier correspondent des k-uplets que l'on peut comparer entre eux
avec un ordre total, l'ordre lexicographique (noté £). Par
exemple, on a les relations :
(0) £ (0,0) £ (0,2,0) £ (0,3) £ (0,3,0) £ (0,3,0,1) £
(0,3,2) £ (0,4)
EXERCICE 3
En utilisant les remarques précédentes
et en comparant les états successifs de l'échiquier avec l'ordre
lexicographique,
donnez l'entête, la précondition, la postrelation et le variant de la méthode récursive .
EXERCICE 4
En utilisant la classe EchiquierDeReines décrite en annexe,
écrivez les méthodes uneSolution de la classe Reines, qui
calculent récursivement une solution au problème des reines. Vous devez
utiliser uniquement les méthodes de la classe publique EchiquierDeReines et aucune des méthodes de la sous-classe
privée GestionOccupationEchiquier.
EXERCICE 5
Donnez la complexité de la méthode uneSolution.
EXERCICE 6
Inspirez-vous de la méthode uneSolution pour écrire la méthode
toutesLesSolutions de la classe Reines, qui calcule toutes les
solutions possibles au problème des reines. Quel est la complexité de
cette nouvelle méthode ?
EXERCICE 7
En utilisant les méthodes de la classe privée GestionOccupationEchiquier
ainsi qu'une structure de données connue, donnez les attributs et écrivez
les méthodes de la classe EchiquierDeReines.
EXERCICE 8
Trouvez une représentation judicieuse pour les instances de
la classe GestionOccupationEchiquier et donnez les attributs et le corps de
toutes les méthodes de cette classe.
This document was translated from LATEX by
HEVEA.