Laiko ribojimas: 1s
Atminties ribojimas: 64MB
Baigtinis automatas
Baigtinis automatas (angl. finite state machine) - tai ypatingas orientuotas grafas, leidžiantis modeliuoti tam tikras būsenas ir jų kitimą, priklausomai nuo to, kokie duomenys "leidžiami" per automatą.
Šiame uždavinyje nagrinėsime ypatingą baigtinio automato atvejį, kuriame kiekviena viršūnė turi po lygiai dvi išeinančias briaunas, pažymėtas simboliais '0'
ir '1'
. Tokio baigtinio automato pradinius duomenis sudaro simbolių eilutė, sudaryta iš nulių ir vienetų. Šią simbolių eilutę "perleidus" per automatą, galutinė jo būsena ir yra ieškomas atsakymas.
Duomenų "leidimas" per automatą veikia taip:
- Pradedame "pradinėje" viršūnėje (ji būna iš anksto nustatyta)
- Tikriname pirmąjį pradinių duomenų simbolį - pagal jo reikšmę pasirenkame briauną, kuria eisime iš dabartinės viršūnės
- Kartojame tą patį procesą su antru, trečiu ir visais kitais pradinių duomenų simboliais tol, kol pasieksime duomenų pabaigą
Žemiau pateiktas baigtinio automato pavyzdys:
Šiame automate pradinė viršūnė yra (paryškinta). Tarkime, kad pradiniai duomenys yra simbolių eilutė . Panagrinėkime, kaip kinta automato būsena "leidžiant" per jį tokius duomenis:
- Pradinė būsena yra
- Pirmasis duomenų simbolis yra '1', tad būsena pasikeičia į (nes briauna su simboliu '1' veda į viršūnę )
- Antrasis duomenų simbolis yra '0', tad būsena pasikeičia į
- Trečiasis duomenų simbolis yra '0', tad būsena pasikeičia į
- Ketvirtasis duomenų simbolis yra '1', tad būsena išlieka nepakitusi (nes briauna su simboliu '1' veda į tą pačią viršūnę, kurioje prasideda)
- Penktasis duomenų simbolis yra '0', tad būsena pasikeičia į
- Šeštasis duomenų simbolis yra '1', tad būsena pasikeičia į
- Pasiekėme duomenų pabaigą, tad darbą baigiame
Jūsų užduotis - parašyti programą, kuri per duota baigtinį automatą "perleistų" pateiktus duomenis ir atsakytų, kokioje būsenoje automatas baigia darbą.
Pradiniai duomenys
Pirmoje eilutėje pateiktas vienas sveikasis skaičius - baigtinio automato būsenų (viršūnių) skaičius ().
Toliau pateikta eilučių. -ojoje iš jų pateikti du tarpais atskirti skaičiai ir , reiškiantys, kad grafe yra briauna, einanti iš viršūnės į viršūnę ir pažymėta simboliu '0', bei briauna, einanti iš viršūnės į viršūnę ir pažymėta simboliu '1'.
Paskutinėje eilutėje pateikta simbolių eilutė , žyminti duomenis, kuriuos reikia "perleisti" per baigtinį automatą. Simbolių eilutę sudaro nuliai ir vienetai, jos ilgis neviršija .
Viršūnės šiame uždavinyje numeruojamos nuo . Pradine būsena visada laikoma būsena .
Rezultatai
Jūsų programa turi išvesti vieną skaičių - viršūnės, kurioje baigiamas darbas, indeksą.
Pavyzdžiai
Pradiniai duomenys | Rezultatai | Paaiškinimas |
---|---|---|
5 0 1 2 3 4 0 1 2 3 4 100101 |
2 |
Šis pavyzdys atitinka sąlygoje nagrinėta baigtinį automatą. |
Smalsiems
Įdomus faktas - sąlygoje nagrinėtas baigtinis automatas iš tikrųjų turi ir tam tikrą prasmę. Jis moka apskaičiuoti dvejetainiu pavidalu išreikšto skaičiaus dalybos iš penkių liekaną! Jei nagrinėtame pavyzdyje naudotą simbolių eilutę perskaitytume kaip dvejetainį skaičių, tai dešimtainiu pavidalu jis būtų lygus . Baigtinis automatas baigė darbą būsenoje , o skaičiaus dalybos iš liekana išties yra lygi ! Įdomumo dėlei rekomenduojama pabandyti per automatą "perleisti" ir kitokius skaičius, kad būtų galima įsitikinti šia savybe.
Baigtiniai automatai gali būti pritaikomi ir daugybėje vietų realybėje - kompiuterinių žaidimų dirbtiniam intelektui, saldainių aparatuose, įvairiuose programiniuose procesuose ir daugelyje kitų. Daugiau su pačiais baigtiniais automatais galite susipažinti čia.