Autorské riešenie
[stiahni]

Pokúsime sa využiť len tie príkazy, ktoré konštruktéri do systému zabudovali. Prejsť celú miestnosť je možné niekoľkými spôsobmi. Vybrať by sme mali však taký, aby spotreba energie bola čo najmenšia. Prejazd po rovnakých miestach obmedzíme čo najviac.

Využijeme to, že aj vysávač aj miestnosť majú tvar osemuholníka s rovnakými uhlami vo vrcholoch. Dáme pozor na to, že miestnosť nie je pravidelný osemuholník.

Vysávač môže prejsť miestnosťou napr. takto:

Najskôr bude prechádzať po vodorovných pásoch sprava doľava a naopak. Pri stene sa otočí, posunie popri stene o šírku pása (tá je 31, rovnako ako šírka vysávača) a pokračuje k druhej stene. Keďže pri stenách, tam kde sa otáčal, ostanú nepovysávané časti, nakoniec ešte obíde celu miestnosť po obvode.

Do ktorej steny vysávač narazil a ako sa má otočiť aby mohol pokračovať ďalej zistíme podľa toho, ktoré zo senzorov sa aktivovali. Pri náraze do steny sa vysávač bude snažiť posunúť popri stene tak, aby pri ceste na druhú stranu izby nešiel už po povysávanej časti. Musí sa teda posunúť smerom hore (podľa obrázka) o 31 krokov. Pri každom náraze sa vynuluje premenná trasa a kým počet krokov nie je 31, vysávač bude pokračovať popri stene.

Ak vysávač povysáva celé vnútro prejde ešte po obvode miestnosti. To, že už je celé vnútro povysávané zistí vysávať podľa toho, že po náraze už nemá kam pokračovať.

viem vysavaj
 urobTu "povysavane "nie
 urobTu "povysavaneVnutro "nie
 vp 90
 vpred 1000

 kym [nieJe :povysavane] [

      ak nieJe :povysavaneVnutro [
          ak2 zaroven :s3 :s4 [
               nuluj vl 45 vpred 31
               ak2 :trasa < 31 [
                    vl 45 vpred 31-:trasa vl 90
               ][
                    vl 135
               ]
          ][
              ak2 zaroven :s2 :s3 [
                   nuluj vl 90 vpred 31
                   ak2 :trasa < 31 [
                        vl 45 vpred 31-:trasa vl 45
                   ][
                        vl 90
                   ]
              ][
                   nuluj vl 135 vpred 31
                   ak2 :trasa = 0 [
                        urobTu "povysavaneVnutro "ano
                   ][
                        vl 45
                   ]
               ]
          ]
          ak2 :povysavaneVnutro [
               vp 180
               opakuj 7 [
                         vpred 1000 vp 45
                        ]
               urobTu "povysavane "ano
          ][
               vpred 1000
          ]
      ]

      ak nieJe :povysavaneVnutro [
          ak2 zaroven :s1 :s2 [
               nuluj vp 45 vpred 31
               ak2 :trasa < 31 [
                    vp 45 vpred 31-:trasa vp 90
               ][
                    vp 135
               ]
          ][
               ak2 zaroven :s2 :s3 [
                    nuluj vp 90 vpred 31
                    ak2 :trasa < 31 [
                         vp 45 vpred 31-:trasa vp 45
                    ][
                         vp 90
                    ]
               ][
                    nuluj vp 135 vpred 31
                    ak2 :trasa = 0 [
                         urobTu "povysavaneVnutro "ano
                    ][
                         vp 45
                    ]
               ]
          ]
          ak2 zaroven :povysavaneVnutro nieJe :povysavane [
              vp 180 opakuj 7 [
                                vpred 1000 vl 45
                              ]
              urobTu "povysavane "ano
          ][
              vpred 1000
          ]
      ]
 ]
koniec

Najčastejšie chyby, komentár k vašim riešeniam

Najväčší problém ste mali s tým, ako naplánovať vysávanie izby. Niektorí zvolili stratégiu pohybu po špirále z približného stredu miestnosti. Nápad to nie je zlý, ale ak je miestnosť pretiahnutá, tak popri stenách na dlhšej strane prejde vysávač zbytočne veľa krát. Navyše nevieme odhadnúť koľko krát sa má vysávač otočiť. Pri opačnej stratégii, špirále smerom dovnútra, sa vám stalo, že v strede ostala časť miestnosti nepovysávaná.