1

j'ai donc un tableau mur de 15*15 remplit de valeur.
lorsque je choisis une valeur de ce tableau j'aimerais qu'il me comptabilise le nombre de valeur identique adjacents.
J'ai écrit une fonction récursive mais j'ai droit à un débordement de pile. Je cherche donc une solution en C me permettant d'écrire une telle fonction.
voici la fonction récursive :
int Test(int ligne, int colonne, int valeur){
if(mur[ligne-1][colonne]== valeur) somme+=Test(ligne-1, colonne, valeur);
if(mur[ligne][colonne-1]== valeur) somme+= Test(ligne, colonne-1, valeur);
if(mur[ligne +1][colonne] == valeur) somme+= Test(ligne +1, colonne, valeur);
if(mur[ligne][colonne+1] == valeur) somme+= Test(ligne, colonne +1, valeur); return somme;}

j'essaye de construire une fonction qui grace à des boucles balayent ligne par ligne et par colonne le tableau en testant à chaque fois les valeurs rencontrées. je ne sais pas si j'ai été très clair. Toute aide est la bienvenue.

Merci Pékélé
mon site dessins en tout genre ( BD, presse... ) :
http://loupekele.free.fr
mon site de peinture :
http://dmontoro.free.fr

2

heu il faudrait commencer par donner une fonction complete, on ne sait pas ce que vaut "somme" dans ton code par exempe.

sinon, avec ça, tu es sûr d'avoir une erreur quelque part, puisque tu ne testes jamais quand tu es en train de sortir de ta matrice. y'a moyen d'avoir une version corrigée du code, avant d'en venir à une solution avec des boucles ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

[cross]

ton problème vient du fait que tu ne te "souviens" pas de là où tu es passé, donc tu réexplores une infinité de fois le même chemin... (enfin, un nombre fini jusqu'à ce que tu tombes sur un débordement de pile parce que la mémoire est pas infinie évidemment ^^)

donc il faut par exemple que tu passes par un autre tableau où tu marques les cases où tu es déjà passé et les cases "à remplir"... (ou bien si tu n'as pas besoin d'être thread-safe que tu réserves un bit dans le tableau "mur" pour ça, voire une seule valeur si un bit c'est trop)
il y a d'autres méthodes mais ça dépend de tes contraintes en mémoires, du nombre typique de cases valant "valeur", etc... smile

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

4

merci pour les pistes. Je vais creuser ça.
Les valeurs du tableau vont de 1 à 5. j'essaye actuellement de décomposer les phases de test :
je pars d'une position, j'explore à droite pour voir si la valeur change. si c'est le cas, je reprends la position initiale et j'explore à gauche. J'incrémente à chaque fois la somme des valeurs identiques. Ensuite je fait pareil sur des balayement verticaux ( haut /bas).
Mes résultats ne sont pas convaincants. Pour l'instant mon code est écrit en fénix. C'est assez proche du C. Mais je vais juste réécrire en C cette partie de mon programme pour pouvoir poster et tester smile

merci encore et à bientôt
mon site dessins en tout genre ( BD, presse... ) :
http://loupekele.free.fr
mon site de peinture :
http://dmontoro.free.fr

5

bon voilà, j'ai fait un rapide code en C qui remplit et affiche un tableau et teste s'il y a des valeurs identiques.
Mais ce n'est pas parfait, des suggestions ?
#include <stdio.h> #include <math.h> int  mur[14][14],i,j; int somme=0; int x=0; int y=0; int main (int argc, const char * argv[]) {     // insert code here...     printf("retourne le nombre de valeur adjacente dans un tableau\n");      int ligne, colonne;      //remplissage du tableau      for ( i=0;i<15;i++)      for (j=0;j<15;j++)      mur[i][j]=rand()%5;      //affichage du tableau      for ( i=0;i<15;i++)      for (j=0;j<15;j++)      printf("%i\t",mur[i][j]);       while(ligne !=16) {      printf("\nligne:");      scanf("%i",&ligne);      printf("\ncolone:");      scanf("%i",&colonne);           printf("%d",mur[ligne][colonne],"\n");      printf("\n");            test(ligne,colonne,mur[ligne][colonne]);      printf("\nest présent :%i",somme);      } } test ( int ligne, int colonne, int valeur ) { for ( i=0;i<15;i++){      for (j=0;j<15;j++){      if (mur[ligne+x][colonne]==valeur){x++;somme++;}      if (mur[ligne-x][colonne]==valeur){x++;somme++;}      if (mur[ligne][colonne+y]==valeur){y++;somme++;}      if (mur[ligne][colonne-y]==valeur){y++;somme++;}           }      }      return somme; }
mon site dessins en tout genre ( BD, presse... ) :
http://loupekele.free.fr
mon site de peinture :
http://dmontoro.free.fr

6

et une petite image pour illustrer mon code foireux grin
tableau.jpg
mon site dessins en tout genre ( BD, presse... ) :
http://loupekele.free.fr
mon site de peinture :
http://dmontoro.free.fr

7

ben déjà tu pourrais faire ta fonction sur un tableau plus petit. LOL !
Vut que tu ne veux que les valeur adjencente a la valeur de la case initial, limite a 4 ou 8 le nobre de boucle que fait ton programe. Une fois qu'il a testé les quatre ou huit case adjensente a celle de départ il s'arette.

J'espére être clair.

LAF ! ! ... !
avatar
"Je peux pas vous faire le cris du tube de colle." Dixi premier CD de Naheulbeuk

Soutenez la presse indépendante achetez Pirates mag. Je ne parle pas au cons, cela les instruit.
J'ai créé un topic avec un tutorial pour créer une alim 3V stabilisé avec le 5V fournit par le port USB avec en plus la posibilité d'utiliser le cable de liason GP32 <-> PC voir là :
[url]topics/48646-une-alim-3v-a-partir-du-prt-usb [/url]

8

merci LAF mais je tiens la solution. Sur un autre forum on m'a conseillé d'utiliser un algorithme flood fill. Et en effet ça marche smile
Bon maintenant il faut que j'adapte et que je paufine wink
mon site dessins en tout genre ( BD, presse... ) :
http://loupekele.free.fr
mon site de peinture :
http://dmontoro.free.fr