Problème : du triangle
Forum INFOMATH :: Enseignement de l'informatique :: Informatique - Collège & Lycée :: Exercices Pascal
Page 1 sur 2•
Page 1 sur 2 • 1, 2 
Problème : du triangle
Traduit à partir d'une olympiade internationale d'informatique : IOI94
La figure ci-dessus affiche un triangle de nombre. Ecrire un programme qui calcule la somme maximale de nombre en passant par un chemin qui commence du sommet et se termine à un emplacement quelconque de la base.
Les données à propos du nombre de lignes dans le triangle sont à lire depuis le fichier INPUT.TXT. Dans notre exemple, le fichier INPUT.TXT est comme suit :
Données Sorties
La somme maximale est inscrite dans le fichier OUTPUT.TXT. Dans notre exemple : 30
- Code:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
La figure ci-dessus affiche un triangle de nombre. Ecrire un programme qui calcule la somme maximale de nombre en passant par un chemin qui commence du sommet et se termine à un emplacement quelconque de la base.
- Chaque étape peut se faire en bas en suivant diagonale gauche ou en diagonale droite.
- Le nombre de lignes dans le triangle est > 1 et <= 100.
- Les nombres dans le triangle sont compris entre 0 et 99.
Les données à propos du nombre de lignes dans le triangle sont à lire depuis le fichier INPUT.TXT. Dans notre exemple, le fichier INPUT.TXT est comme suit :
- Code:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Données Sorties
La somme maximale est inscrite dans le fichier OUTPUT.TXT. Dans notre exemple : 30
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
Il est très intéressant ce problème.
Le langage recommandé est ... ?
La durée maximale est .... ?
Le langage recommandé est ... ?
La durée maximale est .... ?
Nabil - tunis
خير الناس أنفعهم للناس
خير الناس أنفعهم للناس

nabiL- Admin


- Messages : 1972
Inscrit le : 19 Mar 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
Le langage est le langage de votre choix. Six problèmes de ce type sont à résoudre sur deux journées.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
Est-ce que tu penses que c'est faisable en deux journée - temps libre?
Et quel est le niveau ciblé?
Et quel est le niveau ciblé?
Nabil - tunis
خير الناس أنفعهم للناس
خير الناس أنفعهم للناس

nabiL- Admin


- Messages : 1972
Inscrit le : 19 Mar 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
En effet les IOI (International Olympiads in Informatics) sont des compétitions pour les doués en Informatique.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
Il y a à mon avis quelques difficultés:
1. la représentation des données dans la mémoire de l'ordinateur, ou ce qu'on appelle Les Structudes des Données.
2. selon cette structure de données, trouver le meilleur algorithme de recherche de la solution.
Il y a plusieurs structures de données possibles:
1. un arbre N-Aire: numéro <=> valuation de l'arc.
2. un graphe: numéro <=> valuation de l'arc.
3. un tableau: numéro <=> contenu d'une case
Il y a plusieurs algorithmes qu'on peut utiliser:
1. chemin le plus cours dans un arbre, graphe.
2. recherche du max dans un tableau (modifié)
c'est ma propre réflexion les amis. J'attends vos comments.
1. la représentation des données dans la mémoire de l'ordinateur, ou ce qu'on appelle Les Structudes des Données.
2. selon cette structure de données, trouver le meilleur algorithme de recherche de la solution.
Il y a plusieurs structures de données possibles:
1. un arbre N-Aire: numéro <=> valuation de l'arc.
2. un graphe: numéro <=> valuation de l'arc.
3. un tableau: numéro <=> contenu d'une case
Il y a plusieurs algorithmes qu'on peut utiliser:
1. chemin le plus cours dans un arbre, graphe.
2. recherche du max dans un tableau (modifié)
c'est ma propre réflexion les amis. J'attends vos comments.
informix, Ecole d'ingénieurs
Les passions font vivre l'Homme; sa sagesse le fait seulement durer.
Les passions font vivre l'Homme; sa sagesse le fait seulement durer.

informix- Membre fondamental

- Messages : 350
Inscrit le : 19 Mar 2007
Feuille de personnage
Capacité linguistique:


(1000/1000)
Re: Problème : du triangle
Je propose une solution :
- Code:
program ioi94_01;
const MAX_COUNT = 100;
type tab = array [1..MAX_COUNT, 1..MAX_COUNT] of integer;
procedure saisie_entree(var n : integer ; var t : tab);
var i, j : integer;
begin
repeat
Write('Nombre d''éléments [2..100] : ');
Readln(n);
until (n > 1) and (n <= 100);
for j:=1 to n do begin
for i:=1 to j do begin
repeat
Write('0 <= t[', j, ', ', i, '] <= 99 : ');
Read(t[j, i]);
until (t[j, i] >= 0) and (t[j, i] <= 99);
end;
end;
end;
procedure afficher_tab(n : integer ; var t : tab);
var i, j : integer;
begin
Writeln;
for j:=1 to n do begin
for i:=1 to j do begin
Write(t[j, i]:3);
end;
Writeln;
end;
end;
function Max(x, y : integer): integer;
begin
if (x > y) then Max := x else Max := y;
end;
function MaxRS(n, row, col : integer ; var t : tab):integer;
begin
if (row = n) then MaxRS := t[row, col]
else MaxRS := t[row, col] + Max(MaxRS(n, row + 1, col, t), MaxRS(n, row + 1, col + 1, t));
end;
var
n : integer;
t : tab;
begin
saisie_entree(n, t);
afficher_tab(n, t);
Writeln('Somme Maximale : ', MaxRS(n, 1, 1, t));
readln;
end.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
manianis:
Bravo pour la solution. Comme d'habitude
Quelques commentaires:
1. En voyant une matrice qui contient 100*100 = 10.000 entiers, c'est un peu désagréable, au niveau l'espace mémoire requis, surtout que la matrice est triangulaire et qu'au moins sa moitié ne va pas être utilisée. Suppose que MAX_COUNT = 1000n, alors ... ???!!!!
2. La fonction récursive MaxRS est agréable.
3. Ca serait plus difficile si la question était: trouver la somme maximale ainsi que le chemin engendrant cette somme.
Bravo pour la solution. Comme d'habitude
Quelques commentaires:
1. En voyant une matrice qui contient 100*100 = 10.000 entiers, c'est un peu désagréable, au niveau l'espace mémoire requis, surtout que la matrice est triangulaire et qu'au moins sa moitié ne va pas être utilisée. Suppose que MAX_COUNT = 1000n, alors ... ???!!!!
2. La fonction récursive MaxRS est agréable.
3. Ca serait plus difficile si la question était: trouver la somme maximale ainsi que le chemin engendrant cette somme.
Nabil - tunis
خير الناس أنفعهم للناس
خير الناس أنفعهم للناس

nabiL- Admin


- Messages : 1972
Inscrit le : 19 Mar 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
Admin a écrit:manianis:
Bravo pour la solution. Comme d'habitude
merci, mais, il faut être franc j'ai jeté un coup d'oeil rapide sur les solutions proposées.
Admin a écrit:1. En voyant une matrice qui contient 100*100 = 10.000 entiers, c'est un peu désagréable, au niveau l'espace mémoire requis, surtout que la matrice est triangulaire et qu'au moins sa moitié ne va pas être utilisée. Suppose que MAX_COUNT = 1000n, alors ... ???!!!!
Le plus simple est d'utiliser une matrice. J'ai pensé à construire un graphe. Mais je me suis planté dès le premier stage. Il serait aimable qu'un membre nous donne une solution à l'aide de graphes.
Admin a écrit:2. La fonction récursive MaxRS est agréable.
La solution récursive est toujours, comme on le dit, est la plus intuitive et la plus simple.
Admin a écrit:3. Ca serait plus difficile si la question était: trouver la somme maximale ainsi que le chemin engendrant cette somme.
Là c'est une autre question car plusieurs chemins peuvent donner la somme maximale (cas d'un triangle formé par la même valeur) et n'oubliez pas qu'il s'agit d'une compétition avec trois exercices à résoudre pendant une journée (8 heures maximum).
Merci pour ces commentaires que je qualifie consructifs.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
je pense que la solution de manianis est très acceptable pour une durée de 3 sujets dans 8 heures (olympiade internationale).
manianis: j'ai une remarque. stp, regardre l'exécution suivante:

c'est faux si j'ai bien compris l'énoncé !
le résultat = 113 !
manianis: j'ai une remarque. stp, regardre l'exécution suivante:

c'est faux si j'ai bien compris l'énoncé !
le résultat = 113 !
Sami - Methodix, tunis
Le génie de Newton a consisté à dire que la lune tombe alors que tout le monde voit bien qu'elle ne tombe pas.
(Paul Valéry)
Le génie de Newton a consisté à dire que la lune tombe alors que tout le monde voit bien qu'elle ne tombe pas.
(Paul Valéry)

methodiX- Admin


- Messages : 811
Inscrit le : 22 Mar 2007
Localisation : marsa - IPEST
Feuille de personnage
Capacité linguistique:


(1000/1000)
Re: Problème : du triangle
Non ce n'est pas faux car :
vous aurez remarqué que en dessous du 99 t[4,4] il y'a deux case à zéro.
- Code:
5
0 0
0 0 0
0 0 0 99
99 9 9 0 0
vous aurez remarqué que en dessous du 99 t[4,4] il y'a deux case à zéro.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
Autre remarque:
Pourquoi le VAR avant t dans la fonction récursive? le tableau ne va pas être modifié...
elle m'a beaucoup plu la fonction récursive !!!
Sami - Methodix, tunis
Le génie de Newton a consisté à dire que la lune tombe alors que tout le monde voit bien qu'elle ne tombe pas.
(Paul Valéry)
Le génie de Newton a consisté à dire que la lune tombe alors que tout le monde voit bien qu'elle ne tombe pas.
(Paul Valéry)

methodiX- Admin


- Messages : 811
Inscrit le : 22 Mar 2007
Localisation : marsa - IPEST
Feuille de personnage
Capacité linguistique:


(1000/1000)
Re: Problème : du triangle
Il ne faut pas oublier que la fonction est récursive càd les appels récursifs de cette fonctions sont stockés dans la pile qui risque vite de déborder si on y copie la tableau à chaque fois.
Le Var permet de faire un passage par variable (par référence si vous voulez) ainsi 8 octets seront transmis au programme au lieu des 100*100*2 octets taille du tableau en cas de passage par valeur.
Le Var permet de faire un passage par variable (par référence si vous voulez) ainsi 8 octets seront transmis au programme au lieu des 100*100*2 octets taille du tableau en cas de passage par valeur.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Re: Problème : du triangle
1.
est-ce que ce que vous avez fait (passage par adresse) peut être considéré comme ASTUCE ou bien c'est courant dans les corrections?
2.
y-a-t-il un moyen pour visualiser le contenu de la pile (débogueur?)
est-ce que ce que vous avez fait (passage par adresse) peut être considéré comme ASTUCE ou bien c'est courant dans les corrections?
2.
y-a-t-il un moyen pour visualiser le contenu de la pile (débogueur?)
informix, Ecole d'ingénieurs
Les passions font vivre l'Homme; sa sagesse le fait seulement durer.
Les passions font vivre l'Homme; sa sagesse le fait seulement durer.

informix- Membre fondamental

- Messages : 350
Inscrit le : 19 Mar 2007
Feuille de personnage
Capacité linguistique:


(1000/1000)
Re: Problème : du triangle
The difference between Theory and Practice is that in theory there's no difference between theory and practice but in practice there's.
Le passage par référence est recommandé il ne s'agit pas d'une astuce mais d'une optimisation.
La vraie ASTUCE c'est ce que les enseignants d'informatiques disent aux élèves/étudiants : lorsque le contenu d'une variable change dans un module (procédure/fonction) et que ce changement est requis pour le bon déroulement du programme principal il faut alors procéder à un passage par variable. Il omettent de mentionner le cas que je viens d'évoquer pour simplifier au maximum.
Oui il existe un débogueur et je ne sais pas comment l'utiliser : il s'appelle gdb pour les programmes utilisant GCC. Un débogueur doit être capable de visualiser le contenu de la pile. Microsoft Visual Studio offre aussi un bon debugger.
Pour vous étonner plus que çà Java ne connais que le passage par valeur !!! Comment procéder dans ce cas.
Le passage par référence est recommandé il ne s'agit pas d'une astuce mais d'une optimisation.
La vraie ASTUCE c'est ce que les enseignants d'informatiques disent aux élèves/étudiants : lorsque le contenu d'une variable change dans un module (procédure/fonction) et que ce changement est requis pour le bon déroulement du programme principal il faut alors procéder à un passage par variable. Il omettent de mentionner le cas que je viens d'évoquer pour simplifier au maximum.
Oui il existe un débogueur et je ne sais pas comment l'utiliser : il s'appelle gdb pour les programmes utilisant GCC. Un débogueur doit être capable de visualiser le contenu de la pile. Microsoft Visual Studio offre aussi un bon debugger.
Pour vous étonner plus que çà Java ne connais que le passage par valeur !!! Comment procéder dans ce cas.
manianis- Admin


- Messages : 976
Inscrit le : 10 Oct 2007
Localisation : Tunisie
Feuille de personnage
Capacité linguistique:


(999/1000)
Page 1 sur 2 • 1, 2 



