Problème de permutation d'éléments dans un tableau dynamique 2d
Fermé
BlacK-Sunrise
Messages postés
3
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
23 novembre 2012
-
22 nov. 2012 à 18:39
Utilisateur anonyme - 23 nov. 2012 à 18:12
Utilisateur anonyme - 23 nov. 2012 à 18:12
A voir également:
- Algorithme permutation tableau
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
4 réponses
Utilisateur anonyme
22 nov. 2012 à 22:41
22 nov. 2012 à 22:41
Bonsoir
Oh la la ! Une grande suite de if... else if .. comme ça, ça doit être très fatigant à écrire. Il y avait sûrement beaucoup plus simple à faire.
Déjà, la première simplification serait d'écrire une fonction pour permuter 2 éléments, ça t'éviterait de réécrire 3 affectations à chaque fois.
Mais bon, je suppose que tu as bien vérifié les cas (pas moi) et que ça devrait marcher comme ça... à un détail près.
Tu boucles sur toutes les cases de ton tableau et tu testes si tu tombes sur la case vide. Là tu fais l'échange entre ta case vide et sa voisine. Jusque là tout va bien.
Mais tu devrais t'arrêter là.
Or, tes boucles continuent. Et tu peux retomber sur ton zéro plus loin : tu vas refaire le mouvement encore !
Fais un 'return;' dès que tu fais une permutation pour éviter ce problème.
Oh la la ! Une grande suite de if... else if .. comme ça, ça doit être très fatigant à écrire. Il y avait sûrement beaucoup plus simple à faire.
Déjà, la première simplification serait d'écrire une fonction pour permuter 2 éléments, ça t'éviterait de réécrire 3 affectations à chaque fois.
Mais bon, je suppose que tu as bien vérifié les cas (pas moi) et que ça devrait marcher comme ça... à un détail près.
Tu boucles sur toutes les cases de ton tableau et tu testes si tu tombes sur la case vide. Là tu fais l'échange entre ta case vide et sa voisine. Jusque là tout va bien.
Mais tu devrais t'arrêter là.
Or, tes boucles continuent. Et tu peux retomber sur ton zéro plus loin : tu vas refaire le mouvement encore !
Fais un 'return;' dès que tu fais une permutation pour éviter ce problème.
BlacK-Sunrise
Messages postés
3
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
23 novembre 2012
23 nov. 2012 à 15:02
23 nov. 2012 à 15:02
Ahh ! Merci beaucoup ça marche !
Et oui je pense qu'avec une fonction pour les permutations se serais plus simple ^^' je vais essayer d'en faire une.
Encore merci.
Et oui je pense qu'avec une fonction pour les permutations se serais plus simple ^^' je vais essayer d'en faire une.
Encore merci.
BlacK-Sunrise
Messages postés
3
Date d'inscription
jeudi 22 novembre 2012
Statut
Membre
Dernière intervention
23 novembre 2012
23 nov. 2012 à 17:31
23 nov. 2012 à 17:31
Rebonjour,
Je me tourne à nouveau vers vous parce que j'ai un nouveau problème concernant les permutations dans mon programme. Je voudrais compter le nombre de permutations possibles dans le tableau afin de savoir si le jeu est soluble mais le problème est que j'obtiens une "erreur de segmentation".
Voila la fonction :
Et la création du plateau :
A nouveau j'espère que vous serez en mesure de m'aider,
Merci d'avance.
Je me tourne à nouveau vers vous parce que j'ai un nouveau problème concernant les permutations dans mon programme. Je voudrais compter le nombre de permutations possibles dans le tableau afin de savoir si le jeu est soluble mais le problème est que j'obtiens une "erreur de segmentation".
Voila la fonction :
int plateau_soluble(int **&plateau_copie, int nb_ligne, int nb_colonne){ int i, j, k = 0, l, m; int nb_permutations = 0; int pos_case_vide; for(i = (nb_ligne-1); i >= 0; i--){ for(j = (nb_colonne-1); j >= 0; j--) if(plateau_copie[i][j] != i*j){ for(l = 0; l < (nb_ligne); l++){ for(m = 0; m < (nb_colonne); m++) if(plateau_copie[l][m] == i*j){ break; } } k = plateau_copie[i][j]; plateau_copie[i][j] = plateau_copie[l][m]; plateau_copie[l][m] = k; nb_permutations++; } cout << plateau_copie[i][j] << " " ; } for(i = 0; i < (nb_ligne); i++) for(j = 0; j < (nb_colonne); j++) if(plateau_copie[i][j] == 0){ pos_case_vide = plateau_copie[i][j]; break; } return (nb_permutations%2 == (i+j)%2); }
Et la création du plateau :
int **creer_plateau_copie(int **plateau, int nb_ligne, int nb_colonne){ int i, j; int **plateau_copie = new int*[nb_ligne]; for(i = 0; i < nb_ligne; i++) plateau_copie[i] = new int[nb_colonne]; for(i = 0; i < nb_ligne; i++) { for(j = 0; j < nb_colonne; j++) { plateau_copie[i][j] = plateau[i][j]; } } return (plateau_copie); }
A nouveau j'espère que vous serez en mesure de m'aider,
Merci d'avance.
Utilisateur anonyme
23 nov. 2012 à 18:12
23 nov. 2012 à 18:12
Je n'ai pas cherché à comprendre tes algorithmes - ou plutôt si, mais comme je me suis tout de suite perdu, j'ai abandonné.
En ce qui concerne ton erreur de segmentation, elle vient d'un dépassement des indices.
Ce dépassement vient d'une mauvaise utilisation de break;
Tu as raisonné comme si break te faisait ressortir du nombre de boucles qui t'arrange (4 dans le premier cas, 2 dans le second) alors que break ne fait ressortir que d'un seul niveau. Donc la boucle de rang immédiatement supérieur continue, et tu finis par ressortir du for (l) avec l=nb_ligne; dès que tu te sers de plateau_copie[l][m]; derrière, tu as un dépassement d'indice.
Question subsidiaire : à quoi sert pos_case_vide = plateau_copie[i][j]; puisque tu n'utilises jamais pos_case_vide ?
En ce qui concerne ton erreur de segmentation, elle vient d'un dépassement des indices.
Ce dépassement vient d'une mauvaise utilisation de break;
Tu as raisonné comme si break te faisait ressortir du nombre de boucles qui t'arrange (4 dans le premier cas, 2 dans le second) alors que break ne fait ressortir que d'un seul niveau. Donc la boucle de rang immédiatement supérieur continue, et tu finis par ressortir du for (l) avec l=nb_ligne; dès que tu te sers de plateau_copie[l][m]; derrière, tu as un dépassement d'indice.
Question subsidiaire : à quoi sert pos_case_vide = plateau_copie[i][j]; puisque tu n'utilises jamais pos_case_vide ?