Notes de correction - ENS Cachan
Notes de correction - ENS Cachan
Notes de correction - ENS Cachan
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Concours commun <strong>de</strong>s écoles normales supérieuresÉpreuve pratique d’algorithmique et <strong>de</strong> programmationHalmaSujet et éléments <strong>de</strong> <strong>correction</strong>Juillet 2004Note. Lorsque la <strong>de</strong>scription d’un algorithme est <strong>de</strong>mandée, celle-ci doitêtre courte et précise. Quand on <strong>de</strong>man<strong>de</strong> la complexité d’un algorithme enfonction d’un paramètre n, on <strong>de</strong>man<strong>de</strong> un ordre <strong>de</strong> gran<strong>de</strong>ur du temps <strong>de</strong>calcul dans le cas le pire, par exemple O(n 2 ) ou O(n log n).Des indications et <strong>de</strong>s éléments <strong>de</strong> <strong>correction</strong>du sujet sont ajoutés dans la marge.1 Description du problèmeLe jeu <strong>de</strong> Halma. Ce problème est consacré à la conception d’algorithmesjouant au jeu <strong>de</strong> Halma. C’est un jeu <strong>de</strong> plateau datant <strong>de</strong> l’époque victorienne,se jouant sur un plateau carré quadrillé.Règle <strong>de</strong> victoire. Dans ce problème, on s’intéresse au jeu <strong>de</strong> Halma àun seul joueur, avec un plateau carré <strong>de</strong> taille arbitraire n et un nombre <strong>de</strong>pions arbitraire p. On appelle configuration du jeu la position <strong>de</strong>s pions.La distance d’un pion se situant sur la case (x, y) est par définition x + y.La mesure <strong>de</strong> l’insatisfaction d’une configuration <strong>de</strong>s pions sur le plateau <strong>de</strong>jeu est la somme <strong>de</strong>s distances <strong>de</strong>s pions. Si l’insatisfaction d’une configurationest minimale parmi toutes les configurations ayant le même nombre<strong>de</strong> pions, on dit que la configuration est rangée. Le but <strong>de</strong> ce problème est<strong>de</strong> trouver <strong>de</strong>s algorithmes permettant d’arriver à une configuration rangée,<strong>de</strong> préférence en minimisant le nombre <strong>de</strong> coups entre la configuration <strong>de</strong>départ et cette configuration d’arrivée.Règles <strong>de</strong> déplacement <strong>de</strong>s pions. À chaque coup, on déplace un pion.Plusieurs types <strong>de</strong> déplacements sont possibles.On peut choisir <strong>de</strong> déplacer un pion vers l’une <strong>de</strong>s quatre cases voisines, sicelle-ci est libre.Un pion peut aussi être déplacé par une succession <strong>de</strong> petits sauts. On définitun petit saut comme un déplacement <strong>de</strong> <strong>de</strong>ux cases, dans l’une <strong>de</strong>s quatredirections. Ce déplacement est autorisé si la case d’arrivée est libre, et si lacase intermédiaire est occupée. Contrairement aux dames, le pion par <strong>de</strong>ssuslequel on saute reste sur le plateau <strong>de</strong> jeu. Une succession <strong>de</strong> petits sauts,en nombre arbitraire, est considéré comme un unique coup.Une règle optionnelle permet non seulement <strong>de</strong> faire <strong>de</strong> petits sauts (définisci-<strong>de</strong>ssus) mais aussi <strong>de</strong> grands sauts. Un grand saut est un déplacementd’un nombre pair <strong>de</strong> cases dans l’une <strong>de</strong>s quatre directions, tel que la caseau milieu <strong>de</strong> ce trajet soit occupée, et toutes les autres soient libres.•◦◦◦◦• ◦ ◦ ◦−→◦ • −→ · ◦Exemple <strong>de</strong> déplacementExemple <strong>de</strong> déplacementpar petits sauts ◦ · ◦ ·◦par grands sauts ◦ ◦ ◦Il y a ici une ambiguïté remarquée par unseul candidat. Le sujet aurait dû préciserqu’on n’autorise pas un déplacement dontla case d’arrivée est celle <strong>de</strong> départ.1
Concours commun <strong>de</strong>s écoles normales supérieuresÉpreuve pratique d’algorithmique et <strong>de</strong> programmationOrganisation du problème. Dans la section 2 on étudie quelques propriétés<strong>de</strong>s configurations rangées. Dans la section 3 on définit une configuration<strong>de</strong> départ. Ces <strong>de</strong>ux sections sont indépendantes. Dans la section4 on étudie comment, à partir d’une configuration donnée, choisir undéplacement <strong>de</strong> pion qui diminue le plus possible l’insatisfaction. Cette sectionne dépend que partiellement <strong>de</strong>s résultats <strong>de</strong> la section 2. Dans la section5 on construit <strong>de</strong>s algorithmes <strong>de</strong> rangement utilisant les techniques <strong>de</strong> lasection précé<strong>de</strong>nte.Rappel sur la représentation <strong>de</strong> tableaux bidimensionnels. Onpeut représenter les tableaux bidimensionnels dans <strong>de</strong>s tableaux simples.Par exemple, pour un tableau <strong>de</strong> dimension n, on peut représenter l’élément<strong>de</strong> coordonnées (x, y) par T[x+n*y].2 Préliminaires : configurations rangéesDans cette section, la taille du plateau est arbitrairement gran<strong>de</strong>. Autrementdit, les pions peuvent être sur toute case <strong>de</strong> coordonnées (x, y) avec x ≥ 0 ety ≥ 0. On étudie quelques propriétés élémentaires <strong>de</strong>s configurations rangées.Question 1 Montrez que dans une configuration rangée avec p pions, ladistance du pion le plus loin est min{k| (k+1)(k+2)2≥ p}.Question 2 Décrire comment calculer l’insatisfaction d’une configurationrangée à p pions. Quelle est la complexité <strong>de</strong> votre algorithme en fonction<strong>de</strong> p ? Quelle est l’insatisfaction d’une configuration rangée à 1000 pions ?Question 3 Montrez que si le nombre <strong>de</strong> pions n’est pas un entier <strong>de</strong> laforme k(k−1)2alors il y a plusieurs configurations rangées.3 Préliminaires : configuration <strong>de</strong> départOn utilisera la suite (pseudo-aléatoire) d’entiers positifs (u n ) définie ci-<strong>de</strong>ssous.– u 0 est donné sur votre table. (À reporter en haut <strong>de</strong> votre copie !)– u n = (16383 × u n−1 ) mod 59047, pour n > 0.Question 4 Que valent u 992 et u 9992 ?L’algorithme qui permet <strong>de</strong> répondre àla question 2 peut être en O(p 2 ), O(p),O( √ p) ou O(1). Toutes ces solutions ontété proposées par <strong>de</strong>s candidats.Pour la question 3 il n’est pas nécessaire<strong>de</strong> calculer le nombre <strong>de</strong> configurationsrangées, mais exhiber un exemple ne suffitpas.Dans la suite du problème, on s’intéressera aux cas où le couple (n, p) estpris dans l’ensemble E = {(4, 6), (6, 10), (15, 20), (25, 10)}, et aux <strong>de</strong>ux variantesdu jeu. La configuration <strong>de</strong> départ est définie en plaçant p pions selonl’algorithme ci-<strong>de</strong>ssous : on pose (x i , y i ) = (u 2i mod n, u 2i+1 mod n) ; les positionsinitiales <strong>de</strong>s p pions sont les p premières valeurs distinctes <strong>de</strong> la suite(x 1 , y 1 ), (x 2 , y 2 ), ...On remarque que le premier pion posé sur le plateau a donc pour coordonnées(x 1 , y 1 ), mais que le p-ième pion posé a pour coordonnées (x π , y π ) pour unevaleur π ≥ p.Question 5 Pour chaque choix <strong>de</strong> paramètres (n, p) ∈ E, quelles sont lavaleur π et les coordonnées (x π , y π ) ?On rappelle que selon les règles du jeu, un pion peut se déplacer vers unecase voisine, ou bien faire une succession <strong>de</strong> (petits ou grands) sauts. Onpourrait imaginer <strong>de</strong> n’autoriser que <strong>de</strong>s sauts. La question suivante montreque cela restreindrait beaucoup le déplacement <strong>de</strong>s pions.Il ne faut pas oublier <strong>de</strong> répondre à laquestion 5 avec π et (x π, y π). Il faut faireattention aux indices : on commence par(x 1, y 1) et non (x 0, y 0).2
Concours commun <strong>de</strong>s écoles normales supérieuresÉpreuve pratique d’algorithmique et <strong>de</strong> programmationQuestion 6 Montrez que si un pion ne se déplace que par sauts, il y a troisquarts <strong>de</strong>s cases du damier auxquelles il n’a pas accès, indépendamment <strong>de</strong>la position <strong>de</strong>s autres pions. Cette propriété définit une partition <strong>de</strong> l’ensemble<strong>de</strong>s cases du damier en quatre parties. Donnez une définition caractérisantces quatre parties, et donnez (pour la configuration <strong>de</strong> départdéfinie ci-<strong>de</strong>ssus) le nombre <strong>de</strong> pions dans chaque partie ainsi définie.Pour la question 6, il suffit <strong>de</strong> remarquerqu’un saut conserve la parité <strong>de</strong>s coordonnées.Certains candidats n’ont pasvérifié que la somme <strong>de</strong>s nombres <strong>de</strong> pions<strong>de</strong>s quatre parties doit être p.4 Étu<strong>de</strong> d’un coupDans cette section, on étudie la configuration <strong>de</strong> départ, pour savoir queldéplacement choisir. On étudie donc les coups possibles, et leur effet sur lerangement du plateau (variation <strong>de</strong> l’insatisfaction). On donnera les résultatspour les <strong>de</strong>ux variantes du jeu (petits sauts ou grands sauts) et toutes lesvaleurs (n, p) ∈ E.Question 7 Quelle est l’insatisfaction <strong>de</strong> la configuration <strong>de</strong> départ ? Décrivezl’algorithme que vous avez utilisé et sa complexité en fonction <strong>de</strong> n et p.Question 8 À partir <strong>de</strong> la configuration <strong>de</strong> départ, si on choisit <strong>de</strong> déplacerle pion <strong>de</strong> coordonnées (x 1 , y 1 ), combien <strong>de</strong> cases peut-il atteindre en uncoup ?Décrivez l’algorithme que vous avez utilisé et sa complexité en fonction <strong>de</strong> n.Question 9 À partir <strong>de</strong> la configuration <strong>de</strong> départ, combien y a-t-il <strong>de</strong> coupspossibles (un coup étant défini par la position <strong>de</strong> départ et la position d’arrivéedu pion qu’on déplace) ? Décrivez l’algorithme que vous avez utilisé etsa complexité en fonction <strong>de</strong> n et p.Choix du meilleur coup. On définit <strong>de</strong>ux ordres totaux sur les casesdu plateau : l’ordre ≺ L est l’ordre lexicographique et l’ordre ≺ D celui <strong>de</strong>sdistances. Formellement :– (a, b) ≺ L (c, d) ⇔ a < c ou (a = c et b < d)– (a, b) ≺ D (c, d) ⇔ a + b < c + d ou (a + b = c + d et a < c)Parmi toutes les configurations accessibles en un coup, certaines ont uneinsatisfaction minimale. Le “meilleur coup” est donc l’un <strong>de</strong> ceux-là. Si plusieursréponses sont possibles, on utilise l’un <strong>de</strong>s ordres définis ci-<strong>de</strong>ssus. Lemeilleur coup selon l’ordre ≺ est celui qui fait bouger le pion dont la caseest la plus gran<strong>de</strong> selon l’ordre ≺, et parmi les déplacements <strong>de</strong> ce pion celuipour lequel la case d’arrivée est la plus gran<strong>de</strong> selon l’ordre ≺.Question 10 Décrivez un algorithme qui à partir d’une configuration donnée,calcule le meilleur coup selon l’ordre <strong>de</strong>s distances. Quelle est la complexité<strong>de</strong> votre algorithme en fonction <strong>de</strong> n et p. Quel est son résultat pour laconfiguration <strong>de</strong> départ, pour chaque choix <strong>de</strong> paramètres (n, p) ∈ E.5 Algorithmes <strong>de</strong> résolution du problèmeOn se base sur l’algorithme glouton, qui cherche à chaque coup à minimiserl’insatisfaction. Plusieurs variantes <strong>de</strong> l’algorithme glouton sont possibles,selon la façon dont on choisit le coup parmi ceux qui minimisent l’insatisfactionà l’étape suivante.3La question 7 a permis à certains <strong>de</strong> penserà un algorithme <strong>de</strong> calcul d’insatisfactionmeilleur que le parcours en O(n 2 ) duplateau : le parcours en O(p) <strong>de</strong> la liste <strong>de</strong>spositions <strong>de</strong>s pions. On pouvait en déduirel’intérêt d’utiliser une structure <strong>de</strong> donnéesredondante, stockant simultanément l’état<strong>de</strong>s cases et la position <strong>de</strong>s pions.Pour la question 8, un algorithme naturelrevient à considérer les cases du damiercomme les sommets d’un graphe, quel’on parcourt en marquant les sommets visités.Dans la variante “petits sauts” larecherche <strong>de</strong>s arêtes sortantes se fait entemps constant : il suffit <strong>de</strong> regar<strong>de</strong>r lescases voisines et, pour celles qui sont occupéesla case d’après. La complexité <strong>de</strong>cet algorithme est O(n 2 ), et on peut exhiberun cas où cette borne est atteinte :toutes les cases <strong>de</strong> coordonnées impairesoccupées et le pion en (0, 1). La variante“grands sauts” apparaît plus lente carl’énumération <strong>de</strong>s sauts possibles à partird’une position prend un temps O(n), ce quidonnerait un majorant O(n 3 ). On n’attendaitpas <strong>de</strong> meilleure majoration, même siest possible <strong>de</strong> montrer que pour cette varianteaussi l’algorithme d’énumération <strong>de</strong>scoups possibles prend un temps O(n 2 ).L’algorithme <strong>de</strong> la question 9 a donc unecomplexité O(n 2 p).Un algorithme répondant à la question10 trie la liste <strong>de</strong>s pions par ordre ≺ Ddécroissant, puis la parcourt en calculantpour chacun la liste <strong>de</strong>s coups possibles(répertoriés par leur case d’arrivée). Danscette liste on sélectionne parmi les plusproches <strong>de</strong> l’origine celui dont la premièrecoordonnée est la plus gran<strong>de</strong>. Si la diminutiond’insatisfaction causée par ce coupest strictement meilleure que celle du coupgardé en mémoire, il le remplace. Puis onprend le pion suivant dans la liste.On initialise l’algorithme avec une diminutiond’insatisfaction -2, ce qui permet àl’algorithme <strong>de</strong> ne pas échouer si tous lescoups augmentent l’insatisfaction.
Concours commun <strong>de</strong>s écoles normales supérieuresÉpreuve pratique d’algorithmique et <strong>de</strong> programmationNB : on donnera les résultats pour les <strong>de</strong>ux variantes du jeu et toutes lesvaleurs (n, p).Dans l’algorithme A, si plusieurs coups minimisent autant l’insatisfaction,on choisit le meilleur coup selon l’ordre ≺ D .Question 11 Après combien <strong>de</strong> coups cette variante <strong>de</strong> l’algorithme gloutons’arrête-t-elle ? Quelle est l’insatisfaction à la fin ?Dans l’algorithme A, si plusieurs coups minimisent autant l’insatisfaction,on choisit le meilleur coup selon l’ordre ≺ L .Les questions 11 et 12 sont simplesdès que les algorithmes <strong>de</strong>s questionsprécé<strong>de</strong>ntes, et en particulier <strong>de</strong> la question10, ont été programmés <strong>de</strong> façon modulaire.Question 12 Après combien <strong>de</strong> coups cette variante <strong>de</strong> l’algorithme gloutons’arrête-t-elle ? Quelle est l’insatisfaction à la fin ?On remarque que les algorithmes ci-<strong>de</strong>ssus arrivent rarement à une configurationrangée. Il faut donc trouver un algorithme <strong>de</strong> résolution <strong>de</strong> fin <strong>de</strong>partie. Pour cela, on commence par définir un déplacement en diagonale :c’est une succession <strong>de</strong> <strong>de</strong>ux coups, le premier vers une case voisine, et lesecond vers une case voisine et dans une direction orthogonale à la première.On peut remarquer que certains déplacements en diagonale ne changent pasl’insatisfaction.On propose l’algorithme suivant (algorithme C) : à partir d’une configurationoù il existe un coup qui diminue l’insatisfaction, on applique l’algorithme A.À partir d’une configuration X où aucun coup ne diminue l’insatisfaction,on choisit le plus grand <strong>de</strong>s pions (dans l’ordre ≺ D ) tel que, après une succession<strong>de</strong> déplacements en diagonale ne changeant pas l’insatisfaction, il estpossible en un coup d’obtenir une insatisfaction plus faible que celle <strong>de</strong> laconfiguration X.Question 13 Montrer que l’algorithme C arrive toujours à une configurationrangée. En combien <strong>de</strong> coups range-t-il le plateau, à partir <strong>de</strong>s configurations<strong>de</strong> départ définies plus haut ?L’algorithme D généralise les algorithmes A et B <strong>de</strong> la façon suivante : si plusieurscoups minimisent autant l’insatisfaction, on les choisit simultanément,et on élimine dans l’arbre <strong>de</strong>s exécutions possibles les branches pour lesquellesil existe une autre branche qui à la même profon<strong>de</strong>ur (mesurée ennombre <strong>de</strong> coups) a une insatisfaction strictement plus faible.Question 14 Après combien <strong>de</strong> coups cette variante <strong>de</strong> l’algorithme gloutons’arrête-t-elle ? Quelle est l’insatisfaction à la fin ?La preuve <strong>de</strong> l’algorithme C est simpledès qu’on a prouvé qu’à partir <strong>de</strong> touteconfiguration non rangée il existe unpion qu’on peut rapprocher <strong>de</strong> l’originepar <strong>de</strong>s déplacements en diagonale suivisd’un déplacement vers l’origine. La question13 est légèrement ambiguë car ellespécifique quel pion <strong>de</strong> la configuration Xest déplacé, mais pas quel succession <strong>de</strong>déplacements est choisi. Par analogie avecla façon dont les autres algorithmes choisissentla case d’arrivée du pion déplacé, onpouvait choisir la plus gran<strong>de</strong> selon ≺ D <strong>de</strong>celle qui diminuent le plus l’insatisfaction.On pouvait aussi choisir parmi les successions<strong>de</strong> déplacement diminuant l’insatisfactionl’une <strong>de</strong> celles faisant le moins <strong>de</strong>coups, et s’il y en a plusieurs celle dont lacase d’arrivée est la plus gran<strong>de</strong> selon ≺ D.L’algorithme D se base sur une variante<strong>de</strong> l’algorithme <strong>de</strong> la question 10, qu’onva appeler D0, et qui a pour résultatla liste <strong>de</strong>s coups minimisant l’insatisfaction.L’algorithme D commence avec uneliste l 0 <strong>de</strong> configurations contenant un seulélément : la configuration <strong>de</strong> départ. Àchaque étape, il construit une nouvelle listel i+1 qui réunit toutes les configurations obtenuespar l’algorithme D0 à partir <strong>de</strong>séléments <strong>de</strong> la liste l i. Il ne gar<strong>de</strong> dans l i+1que les configurations d’insatisfaction minimale.4