[ Kretosh @ 09.04.2006. 00:01 ] @
Napravio sam funkicju koja ispisuje sve moguce kombinacije od zadatog tipa slova,ali je proces ispisivanja svih kombinacija dosta spor,pa me interesuje da li neko zna neki bolji algoritam za ovako nesto,ili mozda moze da poboljsa moj
Code:

#include <iostream>

int NumOfLetts;

void Function(char * Letters,int n);
int main()
{
    int broj;
    std::cout << "Unesi broj slova" << std::endl;
    std::cin>>broj;
    NumOfLetts=broj;
    char * Slova=new char[broj];
    std::cout<<"Unesi slova";
    for(int i=0;i<broj;i++)
    std::cin>>Slova[i];

    Function(Slova,broj);

return 0;
}

void Function(char * Letters,int n)
{
    int zamena=1;
    char Backup[n];
    for(int i=0;i<n;i++)
      Backup[i]=Letters[NumOfLetts-n+i];               //backup
   for(int i=0;i<n;i++)
      for(zamena;zamena<=n;zamena++)
    {
         if(zamena !=1)
        {
            int z=n;
            char aid=Letters[NumOfLetts-n];
            for(int i=0;i<z-1;i++)
               Letters[i+NumOfLetts-n]=Letters[i+NumOfLetts-n+1];
            Letters[NumOfLetts-1]=aid;

        }


        if(n==2)
        {
            for(int j=0;j<NumOfLetts;j++)
                std::cout<<Letters[j];
                std::cout<<"\n";

                continue;

        }

    Function(Letters,n-1);

}

for(int i=0;i<n;i++)
Letters[NumOfLetts-n+i]=Backup[i];
return;
}


Dakle funcija najpre backupuje array tako sto svaki pojedinacni karakter stavlja redom u pomocni array,odakle ce se pre

izlaska funkcije svako slovo vratiti na svoje mesto.

Funkcija ulazi u for petlju koja se obavlja onoliko puta koliko je slova koja se mogu zameniti.Ukoliko smo dosli do 2

poslednja slova stampamo ceo aray i ne idemo dalje.
Sada se poziva sama funkcija sa n umanjenim za 1(osim ako je n 2).
Posto se izvrsi for petlja vracamo karaktere gde su bili pre ulaska funkcije(kako bi funkcija koja je rekuzirvno pozvala ovu
funkciju mogla da sama izvrsi odgovarajucu zamenu karaktera).

(evo vidim da postoji par ispravki koje bi ubrzale delimicno program ali ne dovoljno(npr NumOfLetts-n nije potrebno stalno racunati posto se uvecava za svaki ulazak u novu funkciju za 1 ali mrzi me da sad to ispravljam).
Da bi se ispisale sve kombinacije od 10 slova potrebno je vise od 5 minuta sto je cini mi se jako puno.Ako vidite neke znacajne greske u algoritmu ispravite me plz.




[Ovu poruku je menjao Kretosh dana 09.04.2006. u 02:43 GMT+1]
[ Kretosh @ 09.04.2006. 01:42 ] @
Izvinjavam se za naziv teme, slucajno se desilo :X:X:X
[ rumpl @ 16.04.2006. 16:38 ] @
Tvoj algoritam i nije toliko los, sad sam ga isprobao sa 10 slova, samo sto sam output ubacivao u jedan fajl
(na linuxu, ./program > fajl ) i program je zavrsio za 20 sekundi!!!
Sto je sasvim dobro za 3628801 linija!!!
A kad sam ga isprobao normalno, zavrsio je za 2 minuta.

U stvari, najsporije u tvom programu je ispisivanje rezutata, probaj da u programu stvoris jedan fajl i da sve rezultate trpas u taj fajl, siguran sam da ce brze raditi.
[ NrmMyth @ 16.04.2006. 17:28 ] @
pogledaj u STL next_permutation(), jedna funkcija rijesava tvoj problem i to leksickim poretkom permutacija
[ rumpl @ 16.04.2006. 19:27 ] @
NrmMyth ja mislim da je covke hteo da napise tu funkciju a ne samo da iskoristi jednu vec postojecu
[ NrmMyth @ 16.04.2006. 20:33 ] @
pa dobro, neka onda pogleda njen kod...
moj grijeh...
[ @zrael @ 18.04.2006. 22:04 ] @
hvala bogu pa su sva slova samo brojevi tako da inkrementiranjem broja dolazi do pomaka u abecedi