Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Implementacja problemu z działu kombinatoryki

Ostatnio zmodyfikowano 2014-07-15 22:23
Autor Wiadomość
kitsss
Temat założony przez niniejszego użytkownika
Implementacja problemu z działu kombinatoryki
» 2014-07-15 13:39:11
Nie potrafię sobie z tym poradzić.
Mając n elementowy ciąg elementów (n należy do naturalnych) każdy z tych elementów może przyjąć losowo postać literki: a,b lub c.
Powiedzmy użytkownik chcę 5 elementowy ciąg i program utworzył: a a c b a
Następnie trzeba wprowadzić w osobne tablice wszystkie możliwe ciągi tych literek, które powstaną poprzez skreślenie DOWOLNEJ ilości elementów(literek)

Przykład:

Program: Podaj n
Użytkownik: 4
Program: wylosowałem a b c b
Program: Wszystkie możliwe ciągi poprzez skreślenie dowolnej ilości elementów:
zbiór pusty (Bo skreśliłem wszystkie) // Pomyślałem, że te ciągi będę przedstawiał w osobnych tablicach o wymiarach[n], lub w jednej dwuwymiarowej[symbolNewtona][n] //o tym niżej
a000
0b00
00c0
000b

ab00
a0c0
a00b
0bc0
00cb
a00b

abc0
0bcb
a0cb
ab0b

abcb

Przed podaniem tych odpowiedzi znam ilość tych odpowiedzi, więc ilość tablic które muszę użyć:  symbol Newtona (kombinacja ile można utworzyć podzbiorów t-elementowych z n-elementowego zbioru):
C/C++
char T[ 4 ] = { a, b, c, b }; // Dla przykładu już utworzyłem ją ręcznie, chociąz program będzie się pytał o jej rozmiar i automatycznie ją wypełniał literkami a,b,c.
int How_Many = 0;
for( int i = 1; i <= n; i++ ) // Tworzy szereg symboli newtona dla wszystkich możliwych podzbiorów 1,2,...,n elementowych z n elementowego zbioru.
{
    How_Many = How_Many +( silnia( n ) /( silnia( i ) * silnia( n - i ) ) ); // Funkcje silni napisałem rekurencyjnie gdzieś z boku.
    if( i == 1 ) // Plus zbior pusty
         How_Many++;
   
}
cout << "Mozliwe " << How_Many << " kombinacji." << endl; // Wynik How_Many powinien wyjść 16, i rzeczywiście tyle jest rozwiązań.
char t2[ How_Many ][ n ];
// I nie wiem jak wypełnić(zaimplementować) poprawnie tą macierz będącą odpowiedzią tego problemu.
P-113818
jankowalski25
» 2014-07-15 20:25:51
Każda litera może się pojawić lub nie. Z tego wynika, że masz 2^n kombinacji. Wstawiasz zero jeśli litery nie ma lub jeden jeśli jest. Na przykład (n=4):
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Możesz utworzyć tablicę zmiennych typu
bool
 (lepiej użyj na przykład zmiennej typu
std::vector < bool >
). Pobierasz wartość typu
bool
 na podstawie indeksu i wypisujesz wynik.
P-113843
kitsss
Temat założony przez niniejszego użytkownika
» 2014-07-15 21:02:15
Vector za bardzo nie chcę, a nawet i nie mogę użyć do mojego projektu.
Czyli mam zrobić tak, że znając ilość wszystkich rozwiązań k, muszę skopiować tą tablicę wejściową którą komputer wylosował (ciąg literek) razy k, i wtedy przyrównać każdą z tych tablic skopiowanych z tym co rozpisałeś, czyli jeśli w indeksie tablicy ,,rozpisanej przez Ciebie" jest zero, to usuwam w tym indeksie literkę z kolejnej kopii oryginału. I tak przyrównać ze sobą wszystkie pary tablic. Dobrze rozumuje? Tylko w dalszym ciągu nie wiem jak zaimplementować dla dowolnej ilości elementów wszystkie rozwiązania w postaci bool (twój przykład).
P-113848
jankowalski25
» 2014-07-15 21:40:39
muszę skopiować tą tablicę wejściową którą komputer wylosował (ciąg literek) razy k
Nie musisz. Wystarczy mieć dwie tablice: w jednej dane, a w drugiej informacje, co wyświetlić.
Tylko w dalszym ciągu nie wiem jak zaimplementować dla dowolnej ilości elementów wszystkie rozwiązania w postaci bool (twój przykład).
To, co ja napisałem, to po prostu kolejne liczby całkowite od 0 do 15 zapisane binarnie. Wystarczy mieć tablicę zmiennych o określonej liczbie bitów, wyzerować ją, a następnie przesuwać o 1 wartości poszczególnych elementów. Dzięki operacjom bitowym dowiesz się, czy dany bit jest ustawiony, czy nie.
P-113849
kitsss
Temat założony przez niniejszego użytkownika
» 2014-07-15 22:23:14
,,To, co ja napisałem, to po prostu kolejne liczby całkowite od 0 do 15 zapisane binarnie. Wystarczy mieć tablicę zmiennych o określonej liczbie bitów, wyzerować ją, a następnie przesuwać o 1 wartości poszczególnych elementów. Dzięki operacjom bitowym dowiesz się, czy dany bit jest ustawiony, czy nie.''

Jesteś TheBest :D Już wiem jak to zrobić :) Dzięki wielkie za pomoc !
P-113850
« 1 »
  Strona 1 z 1