Autorské riešenie
[stiahni]

Úloha je zjednodušená tým, že stred taniera má súradnice [0,0]. Hľadanie stredu taniera teda v tejto úlohe odpadáva. Aby ste úlohu vyriešili, museli ste sa zamyslieť nad najdôležitejšou časťou tejto úlohy. Konkrétne, ako prehľadať celú plochu taniera a v prípade narazenia na farebné body vymyslieť správnu stratégiu spočítania zrniečok a ich roztriedenia do troch nádob.

Začnime teda prehľadaním plochy taniera. Už v 2. kole v 4. úlohe o heliporte sme sa naučili, že korytnačka sa nemôže pohybovať pri prechádzaní plochy taniera ľubovoľne, ale len v smere zvislom alebo vodorovnom. Inak by hrozilo, že korytnačka sa dostane cez hranicu taniera a utečie mimo neho. Jeden z možných jej pohybov, aby však na tanieri nevynechala ani jeden bod, je znázornený na nasledujúcom obrázku. Pohyb je znázornený len symbolicky, korytnačka bude prehľadávať tanier bod po bode.

tanier

Najprv teda presunieme korytnačku na začiatok prehľadávania, zároveň si pamätáme počet krokov, ktoré korytnačka vykoná zo stredu na okraj kružnice v premennej pocitadlo, v našom prípade napríklad takto:

   vl 90
   urobTu "pocitadlo 0
   kym [farbaBodu <> "cierna][
     do 1
     zvys "pocitadlo
     ]

Zastavíme na hranici taniera a postupne prehľadáme všetky body v zvislom smere:

  vp 90
  urobTu "sy Ysur
  opakuj 2*:pocitadlo-1 [
     urobTu "sx Xsur
     nechXYSur :sx+1 :sy
     kym [farbaBodu<>"cierna][vz 1]
     do 1
     kym [farbaBodu<>"cierna][do 1]
     ]

Ak počas prehľadávanie natrafíme na farebný bod, našou úlohou je:

  • vymazať tento bod z plochy taniera, napríklad:

       ak farbaBodu="zelena [
         nechFP "biela bod 1
         ]

  • vložiť ho do príslušnej nádoby (napríklad vytvorením novej korytnačky pre každú nádobu a vkladanie zrniečok do jedného radu nad seba):

      k2'nechXYsur 235 -200
      ak farbaBodu="zelena [
         k2'ph k2'bod 1
         k2'nechFP "zelena
         k2'bod 1
         k2'do 2
         ]

  • zvýšiť hodnotu počítadla hrachu, pšenice alebo fazule:

      urobTu "pocetZelena 0
      ak farbaBodu="zelena [
         zvys "pocetZelena
         hrach'nechHodnota :pocetZelena
         ]

Čo však, ak sa do jedného radu zrniečka v niektorej z nádob nezmestia? V prípade keď je celý rad plný, začneme ukladať zrniečka do nového radu, inak sa len posunieme vyššie:

   ak farbaBodu="zelena [
       ak2 k2'Ysur> 140
         [k2'vp 90 k2'do 4 k2'vp 90 k2'do 340 k2'vp 180]
         [k2'do 2]
     ]

nadoby

Celá procedúra prehladaj potom môže vyzerať nasledovne:

viem prehladaj
   domov
   urobTu "pocetZelena 0
   urobTu "pocetZlta 0
   urobTu "pocetHneda 0
   pre [k2 k3 k4] [skry ph]
   k2'nechXYsur 235 -200
   k3'nechXYsur 295 -200
   k4'nechXYsur 355 -200
   vl 90
   urobTu "pocitadlo 0
   kym [farbaBodu <> "cierna][do 1 zvys "pocitadlo]
   vp 90
   urobTu "sy Ysur
   opakuj 2*:pocitadlo-1 [
      urobTu "sx Xsur
      nechXYSur :sx+1 :sy
      kym [farbaBodu<>"cierna][vz 1] do 1
      kym [farbaBodu<>"cierna][
         ak farbaBodu="zelena [
            zvys "pocetZelena hrach'nechHodnota :pocetZelena nechFP "biela bod 1
            k2'ph k2'nechFP "zelena k2'bod 1
            ak2 k2'Ysur> 140 [k2'vp 90 k2'do 4 k2'vp 90 k2'do 340 k2'vp 180][k2'do 2]
         ]
         ak farbaBodu="zlta [
            zvys "pocetZlta psenica'nechHodnota :pocetZlta nechFP "biela bod 1
            k3'ph k3'nechFP "zlta k3'bod 1
            ak2 k3'Ysur> 140 [k3'vp 90 k3'do 4 k3'vp 90 k3'do 340 k3'vp 180][k3'do 2]
         ]
         ak farbaBodu="hneda [
            zvys "PocetHneda fazula'nechHodnota :pocetHneda nechFP "biela bod 1
            k4'ph k4'nechFP "hneda k4'bod 1
            ak2 k4'Ysur> 140 [k4'vp 90 k4'do 4 k4'vp 90 k4'do 340 k4'vp 180][k4'do 2]
         ]
         do 1
      ]
   ]
koniec

Zaujímavé riešenia:

Úlohu riešilo 8 tímov v kategórii expert a 4 tímy v kategórii profík. Niektorí z Vás použili zoznamy na reprezentáciu zrniečok v nádobách. Zrniečka ste do nádoby presúvali väčšinou pomocou jednej korytnačky, čo síce bolo ťažšie ako cez viac korytnačiek vytvorených osobitne pre každú nádobu, ale riešenia boli aj takto správne. Často ste navrhli prehľadávanie pomocou korytnačky, ktorá sa určitý čas pohybovala aj mimo plochy taniera, no výsledné riešenie bolo správne a keďže v zadaní nebolo presne určené, že korytnačka nesmie prehľadávať mimo taniera, body sme pridelili aj za takýto pohyb. Väčšinou ste riešili úlohu tak, že ste si najprv zistili polomer taniera a následne ste pomocou cyklu opakuj spustili prehľadávanie taniera 2*:polomer -1 krát. Jedno z riešení prehľadávalo plochu taniera pohybmi postupne od stredu taniera k okrajom taniera, čo vieme zapísať takýmto spôsobom:

   opakuj 3600 [
     opakuj :polomer [
       do 1
       // tu je miesto pre kód, ktorý "odnesie" zrniečko, ak sa tu nachádza
       ]
     vz :polomer
     vp 0.1
     ]

Treba si však uvedomiť, že započítané zrniečka pri takomto pohybe o 0.1° vpravo musíme hneď vymazať, aby sa pri tomto pohybe nestalo, že korytnačka ich započíta viackrát.

Najčastejšie chyby:

  • náhodné umiestňovanie zrniečok do nádob môže spôsobiť to, že niektoré zrniečko prepíše predchádzajúce, preto v takom prípade nemusí sedieť počet zrniečok v niektorej z nádob,
  • pri prehľadávaní ste spustili cyklus 2*:polomer – krát, a to na konci spôsobilo, že korytnačka ušla z taniera a prípadne ešte niečo pomenila, ide o klasickú chybu, ktorá sa odstráni zmenšením počtu opakovaní o mínus jednotku,
  • prehľadávanie kružnice ste si zjednodušili na prehľadávanie štvorca opísaného tejto kružnici, teda pomocou dvoch cyklov opakuj.