"parcours" tableau 2D

"parcours" tableau 2D - Algo - Programmation

Marsh Posté le 06-01-2006 à 14:53:59    

Bonjour a tous,
 
Voila ... J'ai un tableau 2D dont je connais le nombre de lignes et dont chaque ligne a un nombre de colonnes connu. Le nombre de lignes doit pouvoi etre variable entre 2 executions du code. Je voudrais enumerer toutes les possibilites. Un exemple sera plus parlant ...
 
2 6
5
4 8
1
 
(on a : t(0)(0) = 2, t(2)(1) = 8, ...)
 
Je voudrais obtenir en sortie les suites :
2 5 4 1
2 5 8 1
6 5 4 1
6 5 8 1
 
D'avance merci


Message édité par boubix le 06-01-2006 à 15:15:37
Reply

Marsh Posté le 06-01-2006 à 14:53:59   

Reply

Marsh Posté le 06-01-2006 à 15:03:36    

Bonjour,
C'est pas très clair... Nombre de lignes et de colonnes variabes, c'est bien ça ? Il y a une limite au tableau (nombre de ligne/col. maxi) ?
Et où en es-tu ? Quelles pistes ? (Rappel : On ne fait pas tout le boulot :ange: )
 
Une possibilité simple-mais pas optimisée :
Un tableau L*C (où L est le nombre maxi de lignes, C le nombre maxi de colonnes), rempli de -1 (par exemple) par défaut.
Ensuite, tu fais deux boucles imbriquées...
 
[Edit]:Autre chose...Change le titre - On saitqu'on est dans "Algo"  :D

Message cité 1 fois
Message édité par macgawel le 06-01-2006 à 15:04:43
Reply

Marsh Posté le 06-01-2006 à 15:08:49    

si ton lagage supporte les tableaux à 2 dimensions (et non vecteurs de vecteurs), ben tu cherches la plus grande dimension des tableau de niveau 2, et tu déclale un tableau comme suit :
 
tab[x, y] avec x = nblignes et y = nbMaxColonnes
 
Ensuite t'as plusqu'à faire une boucle pour recopier les données de ton vecteur de vecteurs dans ce tableau

Reply

Marsh Posté le 06-01-2006 à 15:22:37    

macgawel a écrit :

Bonjour,
C'est pas très clair... Nombre de lignes et de colonnes variabes, c'est bien ça ? Il y a une limite au tableau (nombre de ligne/col. maxi) ?


Pour repondre a tout ca : ma structure de donnees est une classe derivee de std::vector. j'ai donc la methode size() pour connaitre les dimensions de chaque ligne (mon tableau s'apparente en fait a un std::vector <std::vector> de int...). Il y a un nb de lignes maxi, mais pour les colonnes, on ne sait pas (c'est qd meme borne ...).
Ce que je voulais dire dans mon 1er post, c'est que pour les differentes lignes n'ont pas forcement le meme nombre de colonnes.
 

macgawel a écrit :


Et où en es-tu ? Quelles pistes ? (Rappel : On ne fait pas tout le boulot :ange: )


ben je galere un peu pq je vois pas comment gerer ca avec un systeme de boucles ...
 

macgawel a écrit :


Une possibilité simple-mais pas optimisée :
Un tableau L*C (où L est le nombre maxi de lignes, C le nombre maxi de colonnes), rempli de -1 (par exemple) par défaut.
Ensuite, tu fais deux boucles imbriquées...


 
[Edit]:Autre chose...Change le titre - On saitqu'on est dans "Algo"  :D[/quotemsg]

Reply

Marsh Posté le 09-01-2006 à 16:50:53    

Alors, j'ai une solution, mais recursive ... Le probleme, c'est, evidemment, que j'ai parfois tendance a exploser la memoire, et niveau rapidite, c'est pas top. Je la donne :
 
PILE <T> est une classe derivee de std::vector ...
 

Code :
  1. bool EnumAllPos(int raw, const PILE < PILE <int> > &app, PILE <int> &pile, PILE < PILE <int> > &result)
  2. {
  3. if( raw == app.size() )
  4. {
  5.  result << pile;
  6.  return true;
  7. }
  8. int i;
  9. for(i=0;i<app(raw).size();i++)
  10. {
  11.  pile(row) = app(raw)(i);
  12.  EnumAllPos(raw+1,app,pile,result);
  13. }
  14. }


 
Avec l'appel :
 

Code :
  1. EnumAllPos(0,app(i),pile_temp,all_pos);


 
Donc, si vous voyez un moyen pour transformer cette petite chose en algo iteratif, ca m'interesserait au plus haut point ...
Merci d'avance ...

Message cité 1 fois
Message édité par payen le 09-01-2006 à 16:52:13
Reply

Marsh Posté le 10-01-2006 à 12:06:46    

En relisant le sujet du topic, je me rends compte que j'avais un peu pas tout compris à la base :D

Reply

Marsh Posté le 10-01-2006 à 12:16:06    

Solution simple :
 
- Largeur ^ Hauteur. C'est la nouvelle dimension 1 de ton tableau
- i = 0. Tant que i < Largeur ^ Hauteur (t1)
- j = 0. Tant que j < Largeur (t2)
- tab[i, j] = oldTab[(i/Largeur^j)%Hauteur][j]
- j = j + 1
- Fin tant que (t2)
- Fin tant que (t1)
 
Regarde ce que ça donne, chuis pas sûr que ça marche, mais ça a l'air pas trop pire :)
 
Ha, et ça c'est pour un array avec un maximum de bruit (toutes lignes et colonnes remplies avec uniquement des valeurs différentes, donc le cas maximum de valeurs)
Ensuite tu fais une recherche des doublons et tu allimentes le tableau final sans ceux-ci.
 
C'est pas ce qu'il y a de plus propre, mais en revanche c'est simple, et certaiement aussi très rapide.


Message édité par Arjuna le 10-01-2006 à 12:17:40
Reply

Marsh Posté le 10-01-2006 à 21:04:58    

payen a écrit :

Donc, si vous voyez un moyen pour transformer cette petite chose en algo iteratif, ca m'interesserait au plus haut point ...
Merci d'avance ...

Salut
 
Tu peux t'en sortir avec une file, mais ce n'est pas top pour la rapidité.
 
 

Code :
  1. n entier : compte le nombre de lignes du tableau
  2. m entier : compte le nombre de colonnes d'une ligne du tableau
  3. l liste de nombres
  4. F : marqueur de fin d'enfilage (liste nulle ?)
  5. % initialisation de l'algo
  6. enfiler tous les nombres de la première ligne
  7. enfiler le marqueur F
  8. % algo
  9. pour n variant de 2 au nombre de lignes du tableau par pas de 1 faire
  10.   l <- defiler
  11.   tant que l est différente du marqueur de fin d'enfilage
  12.     pour m variant de 1 au nombre de colonnes de la ligne par pas de 1 faire
  13.      enfiler l auquel on ajoute l'élément tab[n,m]
  14.     fin pour
  15.     l <- defiler
  16.   fin tant que
  17.   enfiler F
  18. fin pour
  19. % a la fin tu aura dans ta file toutes les listes de nombres possibles

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed