[C] besoin d'aide aide problème en C
Fermé
Sportif_C
-
24 juil. 2011 à 11:55
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 25 juil. 2011 à 16:42
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 25 juil. 2011 à 16:42
1 réponse
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
25 juil. 2011 à 14:02
25 juil. 2011 à 14:02
Bonjour,
Un petit problème dans la fonction échange, sinon est-ce que la première permutation valide (avec somme à zéro) est suffisante ou faut-il générer toutes les possibilités de permutation des boîtes ? Et dans ce cas il faut créer/utiliser un algo pour générer les permutations.
Un petit bout de code, j'ai créé un type "boite" pour simplifier :
En retour ça me donne pour l'Exemple
1 2 3 4 5 6 7 8 9
3 2 1 -2 -4 1 2 -1 -2
position ok :
2 3 4 5 6 7 8 9 1
2 1 -2 -4 1 2 -1 -2 3
= 0
Faudrait améliorer la fonction échange en ajoutant un algo de permutation pour avoir toutes les possibilités j'imagine que ce serait mieux pour ne pas passer à côté d'une solution
Un petit problème dans la fonction échange, sinon est-ce que la première permutation valide (avec somme à zéro) est suffisante ou faut-il générer toutes les possibilités de permutation des boîtes ? Et dans ce cas il faut créer/utiliser un algo pour générer les permutations.
Un petit bout de code, j'ai créé un type "boite" pour simplifier :
#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct{ int n,v; /* n : numero de la boîte, v : valeur de la boite */ }boite; int verif(boite *b,int n) { /* verif si la somme des boîtes fait bien zéro retourne 0 */ int i,k; for(k=i=0;i<n;i++) k+=b[i].v; if(!k) return 0; return 1; } void print_b(boite *b,int n) { /* affiche les positions des boîtes et leurs valeurs */ int i; for(i=0;i<n;i++) printf("%d ",b[i].n); printf("\n"); for(i=0;i<n;i++) printf("%d ",b[i].v); printf("\n"); } int echange(boite *b,int n) { /* simple fonction a améliorer pour l'échange des boîtes */ int i,j; boite *temp=malloc(sizeof(boite)); assert(temp); for(i=0;i<n;i++){ for(j=0;j<n-1;j++){ *temp=b[j]; b[j]=b[j+1]; b[j+1]=*temp; } if(!verif(b,n)){ free(temp); return 0; } } free(temp); return 1; } int main(void) { /* b est un tableau de boîtes : numéro,valeur,... */ boite b[9]={1,3,2,2,3,1,4,-2,5,-4,6,1,7,2,8,-1,9,-2}; if(!echange(b,9)){ /* si positions sont ok affichage des boîtes */ printf("position ok :\n"); print_b(b,9); } return 0; }
En retour ça me donne pour l'Exemple
1 2 3 4 5 6 7 8 9
3 2 1 -2 -4 1 2 -1 -2
position ok :
2 3 4 5 6 7 8 9 1
2 1 -2 -4 1 2 -1 -2 3
= 0
Faudrait améliorer la fonction échange en ajoutant un algo de permutation pour avoir toutes les possibilités j'imagine que ce serait mieux pour ne pas passer à côté d'une solution
25 juil. 2011 à 14:51
En fait, je n'ai pas compris cette ligne
dans la fonction verification ()
25 juil. 2011 à 16:42
if(k) = si l'expression k est vrai
if(!k) = si l'expression k est fausse