Un problème à résoudre

Le problème des N-reines

Nous allons réaliser un code destiner à résoudre le problème des N-Reines. Ce dernier consiste à placer N reines sur un échiquier NxN en évitant les conflits sur une ligne, une colonne ou une diagonale. Voila une solution pour six reines :

+---+---+---+---+---+---+
|   | R |   |   |   |   |
+---+---+---+---+---+---+
|   |   |   | R |   |   |
+---+---+---+---+---+---+
|   |   |   |   |   | R |
+---+---+---+---+---+---+
| R |   |   |   |   |   |
+---+---+---+---+---+---+
|   |   | R |   |   |   |
+---+---+---+---+---+---+
|   |   |   |   | R |   |
+---+---+---+---+---+---+

Une première solution

  • Préparer une classe Queens.
  • Prévoir une variable d'instance nb non modifiable et affectée par le constructeur.
  • Prévoir un tableau d'entiers pour la position de chaque reine.
  • Prévoir un méthode noConflict(int r) qui vérifie que la reine r n'est pas en conflit avec les reines précédemment posées (de 0 à r-1).
  • Prévoir un méthode solve(int r) qui va résoudre le problème en essayant les positions possibles pour la reine r. En l'absence de conflit, la méthode solve est appelée récursivement sur la reine suivante.
  • Le constructeur va lancer la recherche.
Travail à faire : Tester le bon fonctionnement de votre classe en vous basant sur le tableau ci-dessous :
(N)        Total Solutions
--------------------------
1                        1
2                        0
3                        0
4                        2
5                       10
6                        4
7                       40
8                       92
9                      352
10                     724
11                   2,680
12                  14,200
13                  73,712
14                 365,596
15               2,279,184
16              14,772,512
17              95,815,104
18             666,090,624
19           4,968,057,848
20          39,029,188,884
Travail à faire : Modifier votre classe afin de donner, à la fin, la durée de l'exécution.

Une deuxième solution

Dans cette solution, nous allons utiliser les trois tableaux ci-dessous afin de savoir si une colonne ou une diagonale est libre. Nous n'avons donc plus besoin de comparer la dernière reine avec les précédentes.

boolean[] columns;
boolean[] diagonals1;
boolean[] diagonals2;

Une troisième solution

Dans cette solution, nous allons utiliser les trois ensembles ci-dessous pour mémoriser les colonnes et les diagonales occupées.

Set<Integer> columns = new HashSet<>();
Set<Integer> diagonals1 = new HashSet<>();
Set<Integer> diagonals2 = new HashSet<>();

Prévoir une interface

Prévoir une interface qui va unifier le fonctionnement de ces trois solutions afin de pouvoir facilement passer d'une solution à une autre.