Generowanie tablic 0-1.

0

Mam problem - jak dla podanego n wygenerować (po kolei, nie muszą być zapamiętywane) wszystkie możliwe tablice zero-jedynkowe (bez powtórzeń)?
Np. dla n=2:

0,0
0,1
1,0
1,1

Dla n=3:

0,0,0
1,0,0
0,1,0
1,1,0
0,0,1
1,0,1
0,1,1
1,1,1

0

Rekurencyjnie. Przekazujesz do funkcji n, oraz pustą listę, a wewnątrz funkcji:

  • jeśli n>0 to wpisz do listy 0 i wywołaj funkcja(n-1,lista), następnie usuń 0 z listy, wstaw 1 i wywołaj funkcja(n-1,lista)
  • jeśli n==0 to wypisz zawartość listy
0

w kometarzu masz wszystko:
w metoda pierwsza wywolana z innymi parametrami bedzie rowniez dzialac dla zupelnie innych znakow np. kombinacje1(5,"abcd",4); zrobi Ci kombinacje abcd na sposob taki jak podales wyzej dla n=5

#include <cstdio>

/* sposob pierwszy - bardziej ogolny */
char stos_baza[32]; // mysle ze nie bedziesz generowal dla wiecej niz n=31, bo bys to pol dnia na ekran wypisywal
char* stos = stos_baza; // wskaznik na puste miejsce na szczycie stosu
void push(char znak)
{
  *stos++ = znak; // na szczycie stosu klade znak, i przesuwam szczyt stosu do gory
}
void pop()
{
  *--stos = 0; // zmniejszam wskaznik stosu, czyli po prostu wywalam znak
  // do nowego szytu stosu przypisuje 0, ponieważ chce równocześnie traktować ten stos jako stringa
}
void write()
{
  // wypisuje zawartosc stosu
  printf("%s\n",stos_baza);
}
void kombinacje1(int n, char* alfabet, int alfabet_len)
{
  if (n<=0)
    {
      write();
      return;
    }
  for (int i=0; i<alfabet_len; i++)
    {
      push(alfabet[i]);
      kombinacje1(n-1, alfabet, alfabet_len);
      pop();
    }
}
/* sposob drugi - tylko dla binarnych */
// po prostu wypisuje kolejne liczby od 0 do (2^n)-1 w systemie binarnym
void kombinacje2(int n)
{
  int max = 1<<n;
  for (int i=0; i<max; i++)
    {
      /*konwersja na binarny*/
      for (int j=n-1; j>=0; j--)
        {
          printf("%d",(i>>j)&1);
        }
      printf("\n");
    }
}

int main()
{
  printf("metoda 1 dla n=4:\n");
  kombinacje1(4,"01",2);
  printf("\nmetoda 2 dla n=4:\n");
  kombinacje2(4);
  return 0;
}
0

Super, działa, bardzo dziękuję za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1