Tema: Re: Kaip ispresti si uzdavini?
Autorius: saimhe
Data: 2010-04-12 19:49:11
> Turime N žodžių, sudaryti trumpiausią žodį iš jų visų (vieno žodžio pabaiga yra kito žodžio pradžia). Pvz.: raba, abac, ar ->
> arabac

   Tūpas ir vaizdus sprendimas:
        laikome, kad įmanomi žodžiai iš kiekvienos kombinacijos (kurių yra n!);
        perrenkant visas kombinacijas (patogu manipuliuoti indeksais, t.y.,
            žodžio eilės nr. faile), tikriname, ar kiekviena pabaiga yra
            tolimesnio pradžia, ir korektiškai sudarytų žodžių ilgį įsimename;
        pabaigoje rodome trumpiausią.

   Indeksai leidžia sutaupyti atminties ir greičio.
   Perrinkimas turėtų būti nesudėtingas. Pradinis indeksų masyvas -- tiesiog
skaičiai nuo 0 iki n-1. Patogu naudoti rekursiją arba jos ekvivalentą. Funkcija
gauna masyvą, iš eilės perrenka visus jo elementus; pasirinkto elemento turinį
įrašo į globalų masyvą atitinkamu offsetu, tada kviečia save su masyvo kopija,
kurioje pasirinktoji reikšmė yra pašalinta, nurodydama tos kopijos ilgį.
Nebekviečiama, gavus masyvą iš vieno elemento. Verta dar prieš kviečiant save
patikrinti, ar žodžiai susikombinuoja, ir išsaugoti naujojo fragmento ilgį --
tada pabaigoje bus galima užsiimti tik ilgio įvertinimu.
   Esant galimybei pabaigoje įsiminti visą tą globalų masyvą (sąraše saugant
rodykles?), pakaktų prasukti šitą rekursiją vieną kartą. Paskui jau peržiūrimi
rezultatai, išrenkamas trumpiausias (galbūt ten keli vienodo ilgio), pagal
indeksus iš naujo formuojamas ir išvedamas sukombinuotas žodis. Bonus: išvedami
ir indeksai, kad dėstytuvui nereikėtų sukti galvos tikrinant :)
   Taupant atmintį, pabaigoje pakanka ieškoti, koks ilgis yra minimalus. Tada
sukti rekursiją antrą kartą ir stabdyti, radus tokio pat ilgio žodį.
   Rekursijos lygių gausis nedaug, ar tik ne n-2.

-- 
  saimhe