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

Wszystkie kombinacje danej ilości liter w "słowie"

Ostatnio zmodyfikowano 2012-08-13 22:20
Autor Wiadomość
matka5432
Temat założony przez niniejszego użytkownika
Wszystkie kombinacje danej ilości liter w "słowie"
» 2012-08-07 20:06:32
Witam,
Czy jest prosty sposob, na sprawdzenie wszystkich kombinacji jakiejs dlugosci slowa? Tzn. podmienienie pod kazda literke danego slowa inna literke. Mam na mysli slowa maksymalnie 4-literowe, bo inaczej programowi zajelo by to z 10 min, poniewaz kazda kombinacje bedzie w pewien sposob sprawdzal ;)
Lepiej wytlumaczyc tego nie umiem, jesli ktos nadal nie rozumie, to podaje przyklad :D

slowo 3-literowe...wszystkie kombinacje:

aaa
aab
...
zzy
zzz

Jesli bedzie slowo, w ktorym powtarzaja sie literki, np. "tata" to program powinien to traktowac jako 2-literowe slowo, poniewaz do zamiany ma tylko 2 literki.

P-61936
DejaVu
» 2012-08-07 20:07:54
P-61937
matka5432
Temat założony przez niniejszego użytkownika
» 2012-08-07 20:20:15
Myslalem juz nad takim rozwiazaniem, ale to bedzie dzialac tylko wtedy, gdy slowo bedzie takiej dlugosci, dla jakiej przeznaczony jest kod, bo petli powinno byc tyle, ile nie powtarzajacych sie liter w slowie (chyba ze sie myle). Chcialem, aby moglo byc sprawdzone slowo  o kazdej ilosci liter od 1 do 4.
Jedyny pomysl jaki mi przychodzi do glowy, to napisanie 4 takich kodow w IF'ach, ktore sprawdzaja dlugosc ;D, ale to niestety byloby dosyc dlugie ;>
P-61939
DejaVu
» 2012-08-07 20:31:20
To poczytaj np. o rekurencji.
P-61943
matka5432
Temat założony przez niniejszego użytkownika
» 2012-08-07 23:26:12
Poczytalem troche o rekurencji, przejrzalem przyklady, Ale nie bardzo wiem jak ja moge w tym celu wykorzystac.
Moze ma ktos inny pomysl?
P-61954
graszka
» 2012-08-09 15:52:19
Nie wiem, czy dobrze cię zrozumiałam, ale najłatwiej będzie to zrobić właśnie przez rekurencję w ten sposób, że najpierw tworzysz "słowo":
C/C++
string slowo;
for( int i = 0; i < dlugosc; ++i )
{
    slowo += 'a';
}
a potem wywołujesz taką funkcję:
C/C++
void kombinuj( string slowo, int pos ) //w parametrze "słowo" do "kombinowania" i pozycja na której będziemy "kombinować"
{
    if( pos == slowo.size() - 1 ) //czy "kombinujemy" ostatnią pozycję?
    {
        while( slowo[ pos ] < 123 ) //tablica ASCII się kłania, sprawdzamy, czy nie przekroczyliśmy zakresu małych liter
        {
            cout << slowo << "\n"; //tu wyświetlam kombinację, możesz tu sobie sprawdzać coś
            ++slowo[ pos ]; //zmieniamy literkę na bieżącej pozycji na następną (char jest liczbą oznaczającą konkretna literę)
        }
        slowo[ pos ] = 'a'; //zmieniamy literkę na początkową do ewentualnych dalszych kombinacji
    }
   
    else
    {
        while( slowo[ pos ] < 123 )
        {
            kombinuj( slowo, pos + 1 ); //i najważniejsze - rekurencja, czyli kombinujemy na następnej pozycji
            ++slowo[ pos ];
        }
        slowo[ pos ] = 'a';
    }
}
oczywiście jako pos w parametrze podajesz 0, czyli początkową pozycję. W ten sposób program wypisze wszystkie kombinacje słowa o danej długości. A z tym powtarzaniem liter to przed wyświetleniem sprawdź, czy literki się nie powtarzają i te powtarzające się skasuj.
P-62105
tirou
» 2012-08-09 19:31:08
tylko kolega z góry napisał taki przykład:

aaa
aab
...
zzy
zzz

Z tym zagnieżdzaniem pętli o ktorym wspomniał DejaVu jest proste ale z liczbami bo zwiększa się i=0 ; i++ i leci. A co jeśli chce się tak z literami sprawdzić, żeby wypisało wszystkie możliwe? bo zwiększanie indeksu dla litera chyba nie jest możliwe??
P-62129
DejaVu
» 2012-08-09 19:35:19
Jest możliwe, ponieważ znak to nic innego jak kod ASCII, a kod ASCII to nic innego jak liczba.
P-62131
« 1 » 2 3
  Strona 1 z 3 Następna strona