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

szukam algorytmu aby wypisal wszystkie mozliwe kombinacje

Ostatnio zmodyfikowano 2010-04-13 22:14
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
szukam algorytmu aby wypisal wszystkie mozliwe kombinacje
» 2010-04-12 22:22:58
szukam pomocy, bo dzis ciezko mi sie juz skupic, chodzi mi o algorytm lub podpowiedz, aby mozna bylo wypisac wszytskie mozliwe kombinacje, tzn:

mamy np 3 zmienne, niech beda typu bool, a trzeba, aby wyszukac wszystkie mozliwosci: wszystkie zmienne = 0, wszystkie =1, jedna =1, reszta 0, druga 1, reszta 0 itd... potem pary na zmiane razem 1, trzecia = 0;

co do 3 zmiennych, to da rade wypisac wszystkie mozliwosci, ale jak bedzie ich 20... a wiadomo, chodzi o czas:P

ogolnie widze, ze chodzi o cos podobnego przy dodawaniu bitow (suma logiczna, bo tam o ile sie nie mysle zachodzi podobna zaleznosc)

a chce to umiescic w petli for, no i przy kazdym przejsciu bedzie sie cos zmienialo wg tego algorytmu, az do wykorzystania wszytskich mozliwosci
P-16092
DejaVu
» 2010-04-13 00:45:39
C/C++
for( int i = 0; i < 123; i++ )
for( int j = 0; j < 123; j++ )
for( int k = 0; k < 123; k++ )
{
    //...
}
W Twoim przypadku wartość 123 zastąpisz wartością 2. Jeśli chcesz mieć zmienną ilość pętli zagnieżdżonych to zastosuj rekurencję. Jeśli potrzebujesz mieć dostęp do wszystkich wartości jakie są obecnie ustawione - utwórz jakiegoś vector'a, który będzie przechowywał obecny stan zmiennych. Pi razy drzwi będzie to wyglądało tak:
C/C++
#include <vector>
#include <iostream>

void obliczenia( std::vector < int >& klopsy )
{
    for( long i = 0; i < klopsy.size(); i++ )
         std::cout << klopsy[ i ];
   
    std::cout << std::endl;
}

void szoruj( std::vector < int >& klopsy, int indeks )
{
    if( indeks >= klopsy.size() )
    {
        obliczenia( klopsy );
        return;
    } //if
   
    for( int i = 0; i < 7; i++ )
    {
        klopsy[ indeks ] = i;
        szoruj( klopsy, indeks + 1 );
    } //for
}

int main()
{
    std::vector < int > ble;
    ble.resize( 3 );
    szoruj( ble, 0 );
    return 0;
}
Uhm... kiedy to ja ostatnio coś sensownego na forum napisałem :P chyba w zeszłym roku - czuj się wyróżniony, że mi się chciało :)
P-16097
dmx81
Temat założony przez niniejszego użytkownika
» 2010-04-13 19:35:53
wielkie dzieki :)
1. dlugo zajelo rozwiazanie problemu?
2. rozwiazanie przyszlo przez logiczne rozpatrzenie problemu, czy przez np duze doswiadczenie i uzycie znanego z wielu innych problemow sposobu?
3. dlaczego rozwiazanie dziala dla argumentow do resize(8) a powyzej juz nie?
P-16123
dmx81
Temat założony przez niniejszego użytkownika
» 2010-04-13 20:00:13
4. probuje zanalizowac program i nie potrafie jeszcze do konca...

pierwsz krok (index=0 wiec mniejszy od ble.size(),i=0)
ble[0]=0  ==>  index+1 wiec mniejszy od ble.size(), i=0)
ble[1]=0  ==>  index+1+1 wiec mniejszy od ble.size(), i=0)
ble[2]=0  ==> index+1+1+1 wiec = ble.size,wypisanie wynikow i....??

i krok drugi,???  (index=0, i= 1??)
ble[0]=1;
ble[1]=1;
ble[2]=1

??....

nie wiem jak powinienem poprawnie ten kod rozpisac, help, czy w ogole dobrze zaczynam i co dalej

(bo np rekurencje z silnia rozumiem co i jak, a tego przykladu nie potrafie ...)
P-16124
DejaVu
» 2010-04-13 22:14:04
1,2,3,4) nie wiem czy jest na to jakieś gotowe rozwiązanie - ja sobie takie wymyśliłem na poczekaniu. Rozwiązanie, które przytoczyłem jest efektem doświadczenia i rozwiązania iteracyjne są akurat w tym wypadku katorgą w implementacji. Odpal debugger'a i sprawdź jak działa rekurencja poprzez przejście krok po kroku - tłumaczenie tego jest bez sensu ;p po prostu najlepiej to zobaczyć.

Kontynuując swój wywód - spróbuj dać:
C/C++
for( int i = 0; i < 10; i++ )
     bla.push_back( 0 );
zamiast bla.resize();
P-16134
« 1 »
  Strona 1 z 1