Keresés

Új hozzászólás Aktív témák

  • Jester01

    veterán

    válasz Deark #1063 üzenetére

    Először rendezd abc sorrendbe a beadott szót. Ez gondolom menni fog.
    Utána csinálj egy tömböt amiben jelzed, ha egy betűt már felhasználtál.
    Alapesetben ez legyen csupa igaz érték (true/1).
    Egy másik tömbben pedig a permutált indexeket gyűjtöd, ez alapesetben egyesével nő.
    Rögvest írd is ki, mert ez lesz a legelső permutáció.

    A következőt pedig úgy kapod meg, hogy az utolsó karaktertől elindulsz és mindig megkeresed a következő fel nem használt betűt. Ha már nincs ilyen, akkor lépsz eggyel visszább (ha nem tudsz, akkor kész vagy). Amint találtál egyet, ismét elindulsz előre és szépen veszed az első fel nem használt betűt.

    Igy valahogy:

    for(i = len - 1; i >= 0; i--)
    {
    int current = indices[ i ];
    used[current] = 0;
    current = findnextunused(used, current + 1, len);
    if (current < len)
    {
    indices[ i ] = current;
    break;
    }
    }
    if (i < 0)
    {
    break;
    }
    indices[++i] = findnextunused(used, 0, len);
    for(i++; i < len; i++)
    {
    indices[ i ] = findnextunused(used, indices[i - 1] + 1, len);
    }



    A findnextunused függvényem második paramétere a keresés kezdőpozíciója.
    A megtalált betűt be is jelöli, hogy használatban van.
    Biztos van egyszerűbb módja, mindig is utáltam a kombinatorikát :B

    Emitter: a rekurziót is utálom :DDD De azért persze szoktam használni.

    MOD: [ i ] :U



    [Szerkesztve]
  • emitter

    őstag

    válasz Deark #1063 üzenetére

    a sorba rendezésre itt van egy, de ez csak számokat rak sorba, mingyá előkotrom a stringes verziót is ;) [link]

    a betűk megkeverését (amit n! féleképp tudsz megtenni) szvsz vhogy rekurzióval kell (érdemes ) megoldani, a baj csak az, h nem tudom hogyan ;] majd vki okosabb megmondja a tutit
    for ciklusokkal is lehetne, de ekkor szvsz annyi ciklus kéne amennyi a string hossza, ez a megoldás márpedig enyhén ronda :(

Új hozzászólás Aktív témák