All pastes #417060 Raw Edit

Anonymous

public text v1 · immutable
#417060 ·published 2007-03-30 18:31 UTC
rendered paste body
#include <stdlib.h>
#include <stdio.h>
// But :
// Lister tous les arrangements de bits de longueur N contenant U
// fois le digit 1 par ordre décroissant.

/*

Exemple :
en entrée ...

4 2

en sortie ...

1100
1010
1001
0110
0101
0011

*/



int N, U;

// Fonction récursive
void Etendre(char * tab, int nb0, int nb1){
    int i;

    int size = nb0 + nb1;

    if(size == N){
        // La chaine est pleine
        if(nb1 == U){ // Sureté, seulement si le nombre répond aux critères
            for(i=0; i<N; i++) putchar(tab[i]);
            putchar('\n');
        }
        return;
    }

    // Si on peut encore caser des uns, on copie le tableau arrivant et on le complète avec un 1
    if(nb1<U){
        char * t1 = malloc((size+1)*sizeof(char));
        strcpy (t1,tab,size);
        t1[nb0+nb1+1] = '1';
        Etendre(t1, nb0, nb1+1);
    }

    // On copie le tableau arrivant dans t0 et on le complète avec un zero
    // (uniquement s'il le nombre de zero finale n'a pas été atteint)
    if(nb0<N-U){
        char * t0 = malloc((size+1)*sizeof(char));
        strcpy (t0,tab,size);
        t0[nb0+nb1+1] = '0';
        Etendre(t0, nb0+1, nb1);
    }

}

void arrangements (int N, int U){
    // On lance la récursion avec un tableau vide
    Etendre(NULL, 0, 0);
}

int main (void)
{
  scanf ("%d%d", &N, &U);
  arrangements (N, U);

  return 0;
}