bonjour à tous
J'ai un petit souci dans la fonction récursive
Cette fonction doit permettre de trouver toutes les combinaisons possibles pour un puzzle pour un nombre de piece qui peut varrier, d'où l'utilisation de la récursivité. Les pièces sont des monbres compris entre 0 et le nombre de pièce - 1. (pour 6 pièces de 0 a 5). une contraintes pour le placement des pièces, le numéro de la pièce ne doit pas correspondre a rang dans le tableau (exemple 0 ne peut pas être en case 0)
lors de l'empilage, cela fonctionne correctement, la fonctions s'appelle normalement et exécute ce que je lui demande. C'est lors du dépilage que ca coince et je ne trouve pas pourquoi. en effet, lorsque la fonction la plus basse se termine, elle rend la main à celle immédiatement supérieure et à ma grande surprise, le tableau coteanant la combinaison contient n'importe quoi.
voilà déja un appercu de l'affichage
fonction de rang 0
1
fonction de rang 1
1 0
fonction de rang 2
1 0 3
fonction de rang 3
1 0 3 2
fonction de rang 4
1 0 3 2 5
fonction de rang 5
1 0 3 2 5 4
et lorsqu'on remonte dans la fonction de rang 4, le tableau est le suivant :
0 1 2 4 3.
voici le code
void Calculer(int Puzzle[], int Position)
{
int i; // Indice de boucle
Decalage(Position);
printf("On rentre dans la fonction calculer avec comme position %d\n", Position);
// On prend l'indice
for(i = 0; i < MAX_PIECE; i++)
{
Decalage(Position);
printf("L'indice = %d\n", i);
// SI on est dans le cas du premier passage
if(Position == 0)
{
// i ne doit pas être égal a son rang c'est a dire 0
if(i != 0)
{
Decalage(Position);
printf("On a trouver un indice qui convient : %d\n", i);
Puzzle[Position] = i;
Decalage(Position);
AfficherPuzzle(Puzzle);
printf("\n");
// On rappel la fonction pour la position suivante
Calculer(Puzzle, (Position + 1));
}
else
{
Decalage(Position);
printf("l'indice a la meme valeur que ca position\n");
}
}
else
{
// L'indice doit être différent du rang
if(!Existe(i, Puzzle))
{
// On regarde si l'indice n'existe pas déja
if(i != Position)
{
Decalage(Position);
printf("On a trouver un indice qui convient : %d\n", i);
Puzzle[Position] = i;
Decalage(Position);
AfficherPuzzle(Puzzle);
printf("\n");
// Si on n'est pas a la dernière pièce
if (Position != (MAX_PIECE - 1))
{
// On rappel la fonction pour passé a lindice suivant
Calculer(Puzzle, (Position + 1));
Decalage(Position);
printf("Affichage du puzzle en remontant !\n");
Decalage(Position);
AfficherPuzzle(Puzzle);
printf("\n");
}
}
else
{
Decalage(Position);
printf("l'indice a la meme valeur que ca position\n");
}
}
else
{
Decalage(Position);
printf("L'indice a deja ete utilise !\n");
}
}
}
// Si on est a la dernière position
// On affiche le puzzle
if(Position == (MAX_PIECE - 1))
{
// Si le puzzle est complet
if(Complet(Puzzle))
{
// On affiche le puzzle
Decalage(Position);
AfficherPuzzle(Puzzle);
// On calcule et on affiche le nombre de coup
// de la position
printf("Nombre de coup : %d\n", NbCoup(Puzzle));
}
printf("\n");
Pause();
}
// On remet l'indice a -1
Puzzle[Position] = -1;
Decalage(Position);
printf("On remonte dans la fonction de rang supérieur !\n");
}
int main(int argc, char* argv[])
{
// On crée le tableau du puzzle
int Puzzle[MAX_PIECE];
// On initialise le puzzle
InitPuzzle(Puzzle);
Calculer(Puzzle, 0);
Pause();
return 0;
}
La fonction Decalage affiche des espaces
la fonction AfficherPuzzle affiche le tableau du puzzle
la fonction Complet teste si le puzzle est complet (toutes les pièces ont été entrée)
La fonction Existe teste si l'indice i exsite dans le Puzzle
Merci d'avance