svp je chercher pas un algorithme mais juste je voudrais corriger le mien.
Cela nécessite tout de même de réfléchir sur cet algorithme même si on conserve l'idée de base que tu as (partir du nombre de 1 ou de 0 consécutifs dans une colonne donnée).
Tu veux construire un tableau (mat) contenant la liste des combinaisons possibles de n bits (comme dans l'exemple de ton message précédent).
- D'abord, ton tableau de 50x50 n'est pas approprié puisqu'il y a beaucoup plus de lignes que de colonnes. En prenant le premier indice comme celui des lignes, on peut envisager par exemple un tableau
- Il faut savoir où mettre les '0' et où mettre les '1' dans une colonne.
Si n est le nombre de bits et N le nombre de combinaisons (= 2^n) et si on considère la colonne C (=0..n-1), on constate que les blocs de '0' et les blocs de '1' ont chacun Bloc(C) = N/2^(C+1) éléments soit :
Bloc(0) = N/2
Bloc(i+1) = Bloc(i)/2, i=0...
Dans ton exemple n=4 , N=16, Bloc(0)=8, Bloc(1)=4, Bloc(2)=2, Bloc(3)=1
- On peut numéroter les blocs à partir de 0 en partant de la première ligne. Alors, les blocs de numéro impair doivent avoir un '1' et les autre un '0'. Il suffit donc de savoir le numéro du bloc où on se trouve.
Si on est sur la ligne L, Le numéro de bloc de la colonne C où on se trouve est L/Bloc(C)
Alors :
Initialiser la taille d'un bloc Bloc à N/2
De la colonne C=0 à la colonne C=n-1
- De la première ligne L=0 à la dernière ligne L=N-1
Si L/Bloc est impair (L/Bloc%2==1) mettre '1' sinon mettre '0'
- Diviser Bloc par 2
Ce qui nous donne :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ....
char tab[256][8];
int C,L;
int Bloc= N/2;
// Calcul
for(C=0; C<n;C++,Bloc/=2)
for(L=0; L<N;L++)
tab[L][C] = L/Bloc%2==1 ? '1' : '0'; //ou,si on préfère, utiliser un if...else
// Affichage
for(L=0; L<N;L++)
{
for(C=0; C<n;C++) printf("%c ", tab[L][C]);
printf("\n");
} |
- Autre possibilité qui se rapproche plus de ton code je crois:
Sur la colonne C, on a NBloc(C) = N/Bloc(C)/2 = 2^C blocs constitué d'un bloc de Bloc(C) '0' suivi d'un bloc de Bloc(C) '1' soit :
NBloc(0) = 1
NBloc(i+1) = 2*NBloc(i) i=0...
Dans ton exemple n=4 , N=16, Bloc(0)=8, Bloc(1)=4, Bloc(2)=2, Bloc(3)=1, NBloc(0) = 1, NBloc(1) = 2, NBloc(2) = 4, NBloc(3) = 8
- Initialiser la taille d'un bloc Bloc à N/2 et le nombre de blocs NBloc à 1
- De la colonne C=0 à la colonne C=n-1
- Se placer sur la première ligne (L=0)
- faire NBloc fois
- de i = 0 à Bloc-1 tab[L][C] = '0' ; incrémenter L;
- de i = 0 à Bloc-1 tab[L][C] = '1' ; incrémenter L;
- Diviser Bloc par 2
- Multiplier NBloc par 2
1 2 3 4 5 6 7 8 9 10 11 12 13
| .....
int Bloc= N/2;
int NBloc = 1;
for(C=0; C<n; C++,Bloc/=2,NBloc *=2 )
{
for(L=0, j=0; j<NBloc;j++)
{
for(i=0; i<Bloc; i++, L++)tab[L][C] = '0';
for(i=0; i<Bloc; i++, L++)tab[L][C] = '1';
}
}
//affichage
.... |
Partager