Voir les cours et résoudre les problèmes en :
Le C est un langage de programmation impératif conçu pour la programmation système. Inventé au début des années 1970 avec UNIX, C est devenu un des langages les plus utilisés. De nombreux langages plus modernes se sont inspirés de sa syntaxe. Il privilégie la performance sur la simplicité de la syntaxe. [En savoir plus]
Le C++ est un langage de programmation impératif. Inventé au début des années 1980, il apporte de nouveaux concepts au langage C (les objets, la généricité), le modernise et lui ajoute de nombreuses bibliothèques. C++ est devenu l'un des langages les plus utilisés. Sa performance et sa richesse en font le langage de prédilection pour les concours. [En savoir plus]
Pascal est un langage de programmation impératif inventé dans les années 1970 dans un but d'enseignement. Quoiqu'encore utilisé à cette fin, l'absence de bibliothèque standard en limite son utilisation malgré une grande efficacité. Sa syntaxe a été reprise par d'autres langages plus modernes avec plus ou moins de succès. [En savoir plus]


Remarque : Les cours pour ce langage ne sont disponibles que jusqu'au chapitre 4, « Lecture de l'entrée ». Les corrections sont toutefois toujours fournies.
OCaml est un langage de programmation fonctionnel inventé au milieu des années 1990. Il permet aussi une programmation impérative ou objet. Il permet d'écrire des programmes courts et faciles à vérifier et est ainsi utilisé pour certains systèmes embarqués très sensibles comme ceux des avions. Il est utilisé dans l'enseignement en classes préparatoires aux grandes écoles. [En savoir plus]


Remarque : Les cours pour ce langage ne sont disponibles que jusqu'au chapitre 4, « Lecture de l'entrée ». Les corrections sont toutefois toujours fournies.
Java est un langage de programmation impératif et orienté objet. Inventé au début des années 1990, il reprend en grande partie la syntaxe du langage C++ tout en la simplifiant, au prix d'une performance un peu moins bonne. S'exécutant dans une machine virtuelle, il assure une grande portabilité et ses très nombreuses bibliothèques en font un langage très utilisé. On lui reproche toutefois la « verbosité » de son code. [En savoir plus]


Remarque : Pour un débutant souhaitant apprendre Java, nous conseillons fortement de commencer par JavaScool, plus facile à apprendre, bien que fortement similaire.
Java's Cool (alias JavaScool) est conçu spécifiquement pour l'apprentissage des bases de la programmation. Il reprend en grande partie la syntaxe de Java sur laquelle il s'appuie, mais la simplifie pour un apprentissage plus aisé. La plateforme JavaScool est accompagnée d'un ensemble d'activités diverses de découverte de la programmation. [En savoir plus]
Python est un langage de programmation impératif inventé à la fin des années 1980. Il permet une programmation orientée objet et admet une syntaxe concise et claire qui en font un langage très bien adapté aux débutants. Étant un langage interprété, il n'est cependant pas aussi performant que d'autres langages. [En savoir plus]
Pour des raisons encore inconnues, l'escalade en salle est en train de devenir un passe-temps populaire parmi de nombreux ex-philatélistes, philantropes et philosophes. Vous avez vous-mêmes decidé de suivre la tendance, et commencez à vous préparer à devenir le champion du monde d'escalade. L'escalade en salle consiste à aller du bas d'un mur au sommet en n'utilisant que votre force pour monter, et en faisant tout votre possible pour ne pas tomber. Près du sommet se trouve une cloche que vous sonnez pour faire part au monde de votre exploit.

Le mur est une surface plane à deux dimensions, contenant des prises en divers points. Pour s'accrocher au mur, vous devez être aggripé à trois prises distinctes quand vous êtes stables, ou à deux prises distinctes quand vous vous déplacez. Si vous en avez moins, vous tombez bêtement !

Pour vous déplacer sur le mur, vous pouvez lâcher l'une de ces trois prises, puis attraper une nouvelle prise. Le temps nécessaire pour effectuer ce déplacement est égal à la somme des distances horizontales et verticales entre la prise que vous avez lâchée, et celle que vous attrapez.

Comme vous ne pouvez atteindre qu'une certaine distance, chacune des trois prises auxquelles vous êtes agrippé doit être à au plus R mètres d'une autre prise que vous tenez, ceci mesuré par la somme des distances horizontales et verticales entre les deux points. Notez qu'elles n'ont pas à être toutes à R mètres les unes des autres. Par exemple, la configuration de départ du diagramme ci-dessous (représentée par les lignes pointillées) a une distance de 2 entre les points 1 et 2, une distance de 2 entre les points 2 et 4, mais une distance de 4 entre les points 1 est 4. Ceci est une configuration valide même si R = 2.

Pour devenir le grimpeur le plus rapide au monde, vous devez déterminer un ensemble de déplacements qui vous mènera à la cloche aussi vite que possible. La cloche est située sur l'une des prises (mais n'est pas nécessairement la plus haute prise). On vous indique sur quelles prises vous commencez à grimper, et on vous garantit que celles-ci correspondent à une situation valide.

Etant donné (i) l'ensemble des prises d'un mur décrites par des coordonnées (x,y) sur un plan et (ii) vos prises de départ, votre objectif est de trouver le temps le plus petit nécessaire pour aller de la position de départ à la cloche.

Par exemple, considérez le diagramme ci-dessus avec R = 2. Chaque cercle représente une prise. Il y a 16 prises (en comptant celle avec la cloche). Supposez que l'on vous demande de commencer agrippé aux prises 1, 2 et 4 comme indiqué. Une manière possible d'atteindre la cloche serait :

  • lâcher la prise 4 et attrapper la prise 3 (1 seconde);
  • lâcher la prise 1 et attrapper la prise 5 (3 secondes);
  • lâcher la prise 2 et attrapper la prise 8 (3 secondes);
  • lâcher la prise 3 et attrapper la prise 11 (4 secondes);
  • lâcher la prise 5 et attrapper la prise 15 (6 secondes);
  • lâcher la prise 8 et attrapper la prise 16 (6 secondes);

Ceci demande un total de 1+3+3+4+6+6 = 23 secondes, et est en fait le moyen le plus rapide d'atteindre la cloche.

Limites de temps et de mémoire (Python)

  • Temps : 2 s sur une machine à 1 GHz.
  • Mémoire : 64 000 ko.

Contraintes

  • 1 <= N <= 50, où N est le nombre de prises sur le mur;
  • 1 <= R <= 6, où R est la distance que vous pouvez atteindre (i.e. la somme maximale de la distance horizontale et verticale entre chaque point que vous tenez, et le point le plus proche que vous tenez);
  • -1,000 <= x,y <= 1,000, où x et y sont les coordonnées d'une prise.

De plus, pour des tests correspondant à 50% des points, N <= 20.

Entrée

Votre programme doit lire sur l'entrée standard. La première ligne de l'entrée contiendra les entiers N et R, séparés par un espace. Les N prises seront numérotées 1...N. La deuxième ligne contiendra les trois entiers distincts A, B et C qui indiquent les trois prises à partir desquelles vous commencez (1 <= A,B,C <= N).

Les N lignes suivantes décrivent les positions des prises. La ième de ces lignes décrit la position de la ième prise, par deux entiers xi et yi. Deux prises n'ont jamais la même position. La cloche est toujours attachée à la Nième prise.

Sortie

Votre programme doit écrire une ligne sur la sortie standard.

Cette ligne doit contenir un simple entier, qui donne le temps le plus petit nécessaire pour aller de la position de départ à la cloche. On vous garantit qu'il sera toujours possible d'atteindre la cloche.

Exemple

entrée :

16 2
1 2 4
4 1
5 2
6 2
7 2
5 3
8 3
3 4
5 5
8 4
9 5
6 6
4 6
9 7
6 7
6 8
8 8

sortie :

23
Vous devez être connecté pour résoudre cet exercice.

Vous devez être connecté(e) pour résoudre ce problème.

L'inscription ne prendra qu'une minute et vous pourrez alors résoudre les exercices puis faire valider automatiquement vos solutions.

Une fois identifié(e), vous pourrez demander sur cette page des conseils pour résoudre le sujet ou demander de l'aide sur le forum d'entraide.

Lorsque vous serez connecté(e), vous pourrez voir vos actions ici.

Une correction détaillée sera disponible lorsque vous aurez résolu le sujet.

Correction en cours de chargement…