Problème de 8 reines Sachant que dans un jeu d'échecs, une dame peut pendre toute pièce se trouvant sur la même colonne ou sur la même ligne ou sur une même diagonale de la case qu’elle occupe, le problème consiste à trouver toutes les solutions possibles pour placer 8 dames sur un échiquier sans qu’aucune dame ne peut prendre une autre comme dans l'exemple ci-contre 11/04/2017
Indications Sur une ligne i, on ne peut placer qu'une et une seule dame dans une case libre. Pour qu'une case soit libre il faut qu'aucune dame parmi celles déjà placées ne soit sur la même colonne ou sur une même diagonale. Deux case (L1, C1) et (L2, C2) appartiennent à une même colonne si C1 = C2. Deux cases (L1, C1) et (L2, C2) appartiennent à une même diagonale si abs(L1 –L2) = abs(C1-C2) 1 D 2 3 4 5 6 7 8 D Exemple Pour la case (5, 4), les cases appartenant à la même diagonale droite sont : (4, 5) (3, 6) (2, 7) et (1, 8)
Abs(5 - 4) = abs(4 - 5) Abs(5 - 3) = abs(4 - 6) Abs(5 - 2) = abs(4 - 7) Abs(5 - 1) = abs(4 – 8) Les cases appartenant à la même diagonale gauche de la case (5, 4) sont : (4, 3) (3, 2) (2, 1) 1 D 2 3 4 5 6 7 8 Abs(5 - 4) = abs(4 - 3) Abs(5 - 3) = abs(4 - 2) Abs(5 - 2) = abs(4 –1) Pour vérifier si une case (L, C) est libre ou non, il faut voir est ce la colonne C a été occupée ou non dans les lignes de 1 à L -1. Même chose pour le deux diagonale. Pour cela un tableau de 8 cases est largement suffisant . Le numéro d'un élément représente le numéro de la ligne à remplir et le contenu de l'élément représente le numéro de la colonne ou a été placée la dame. D Exemple 1 3 5 2 4 6 7 8 Remplissage de la ligne 5 11/04/2017
Pour la ligne 5 nous remarquons que : La colonne 1 est occupée par la ligne 1 La colonne 2 est occupée par la ligne 4 La colonne 3 est occupée par la ligne 2 La colonne 4 est libre Remarques Pour rechercher toutes les solutions possibles nous devons fixer des points de retour que ce soit pour rechercher une autre solution si on a trouvé une ou pour choisir un autre chemin si celui choisi ne mène pas à une solution. Et ça sera la tache de la récursivité. Donc pour chaque ligne nous devons faire un parcours complet de toutes les colonnes si on a trouvé une case libre, on passe à la ligne suivante car la récursivité va le fixer pour y revenir par la suite ceci tant qu'on n'a pas atteint la 8ème ligne. Si la 8ème ligne est remplit, on affiche la solution. Vue que le nombre de solutions est important (92) ainsi que le nombre d'essais à faire, l'affichage ne peut pas se faire à la fin mais doit se faire au fur et à mesure après avoir trouvé chaque solution. Pour cela nous utiliserons une procédure récursive PLACER_DAMES qui cherche les solutions en plaçant les dames une à une sur l'échiquier . Lorsqu'elle trouve une solution elle l'affiche. 11/04/2017& Diapositive 4
Analyse du programme principal La procédure doit commencer par placer la première dame puis elle continu à placer les autres dames une à une. Analyse du programme principal Résultat = Proc Placer_dames (T, 1) Fin T.D.O. Globaux Objet Type/Nature T Placer_Dames TAB Procédure T.D.N. T Type TAB = tableau de 8 octets 11/04/2017 Diapositive 5
Analyse de la procédure Placer_Dames DEF PROC Placer_Dames (VAR T : TAB ; i : Entier ) Résultat = Il faut faire un parcours complet pour fixer des points de retour nécessaire à la recherche d'autres solutions. 1 [ ] SI i < = 8 Alors Pour j de 1 à 8 Faire SI FN LIBRE (T, i, j) ALORS T[i] j Proc Placer_dames (T, i+ 1) Fin SI Fin Pour SINON Proc Affiche_Solution (T, i-1) FIN SI 2 Fin Placer_Dames T.D.O. locaux à Placer_dames Objet Type/Nature j Affiche_Solution LIBRE Entier Procédure Fonction 11/04/2017 Diapositive 6
Analyse de la fonction LIBRE DEF FN LIBRE (T : TAB ; L , C : Entier) : Booléen Résultat = LIBRE R 1 R = [ R VRAI] Pour i de 1 à L – 1 Faire SI (T[i] = C) OU (ABS(L – i) = ABS(C – T[i])) ALORS R FAUX Fin SI FIN POUR LIBRE R 2 Fin LIBRE T.D.O. locaux à LIBRE Objet Type/Nature i R Entier Booléen 11/04/2017 Diapositive 7
خــيب الله ضن من خــيب ضني Analyse de la procédure Affiche_Solution DEF PROC Affiche_Solution (T : TAB ; N : Entier) Résultat = 1 Pour i de 1 à n Faire Pour j de 1 à n Faire SI T[i] = j Alors Ecrire(" R ") SINON Ecrire (" ") Fin SI Fin Pour EcrireNL خــيب الله ضن من خــيب ضني 2 Fin Affiche_Solution T.D.O. locaux à Affiche_Solution Objet Type/Nature i, j Entier 3 1 7 5 8 2 4 6 11/04/2017 Diapositive 8
Traduction en Pascal 11/04/2017 Diapositive 9
Problème du voyageur de commerce 1) Présentation (voir page 226) La stratégie de la solution est donc : à partir de la ville en cours on cherche la ville la plus proche qui n'est pas encore visitée. Cette stratégie va donner une solution mais pas la meilleure. EXEMPLE 1 2 3 4 5 Villes V1 V2 V3 V4 V5 Pour n = 5 et Ville de départ = V3 Le Chemin est : V3-V4-V2-V1-V5-V3 Remarques D(V1, V2) = D(V2, V1) donc éviter la saisie de la même distance deux fois comme dans la solution du livre 2) D(V1, V1) = 0 donc c'est inutile de lui faire la saisie D 1 2 3 4 5 20 10 50 30 25 40 15 11/04/2017 Diapositive 10
Sujet 1 11/04/2017 Diapositive 11