Autorské riešenie
[stiahni]  

  • Počet riešiteľov: 6 / 8 = 75 %

  • Úspešnosť riešenia: 6 / 9 = 67 %

Podľa zadania úlohy máme vytvoriť náhodnú pretekársku dráhu v tvare lomenej čiary s pravými uhlami. V podmienkach úlohy je uvedené, že všetky náhodne vybrané kvety ležia v obdlžníku určenom prvým kvetom a posledným kvetom so zadanými súradnicami. Navyše sa požaduje, aby každú vybranú x-ovú a y-ovú súradnicu mali najviac 2 kvety dráhy. Ilustračné príklady dráh uvedených na obrázkoch v zadaní úlohy spĺňajú všetky spomínané podmienky.

lomená čiara

lomená čiara

Veľmi užitočnou stratégiou riešenia tohto problému je urobenie rozboru možných prípadov a ich vykreslenie. Pretekárska dráha môže mať párny alebo nepárny počet kvetov a prvý úsek dráhy môže byť vo zvislom alebo vodorovnom smere. Pre tieto možnosti nakreslíme obrázky, v ktorých si označíme x-ové a y-ové súradnice bodov náhodnej lomenej čiary.

tajomna mapa - zobrazenie dat

tajomna mapa - zobrazenie dat

tajomna mapa - zobrazenie dat

tajomna mapa - zobrazenie dat

Pri riešení tejto úlohy najprv vygenerujeme náhodný zoznam s x-ovými a náhodný zoznam s y-ovými súradnicami kvetov. Potom z týchto dvoch zoznamov zostavíme zoznam so súradnicami kvetov predstavujúcich lomenú čiaru, ktorú napokon vykreslíme.

Najprv poďme vygenerovať náhodný zoznam s x-ovými a náhodný zoznam s y-ovými súradnicami kvetov. Z uvedených 4 obrázkov vidíme, že pre nepárny počet kvetov majú zoznamy x-ových a y-ových súradníc rovnakú veľkosť. V prípade párneho počtu kvetov a prvého úseku dráhy v zvislom smere bude mať zoznam x-ových súradníc o 1 prvok viac ako zoznam y-ových súradníc. V prípade párneho počtu kvetov a prvého úseku dráhy vo vodorovnom smere bude mať zoznam x-ových súradníc o 1 prvok menej ako zoznam y-ových súradníc. Nižšie uvádzame časť programu, v ktorej sa podľa zadaného smeru :smer a počtu kvetov :počet vypočítava hodnota :početX predstavujúca veľkosť zoznamu x-ových súradníc a hodnota :početY predstavujúca veľkosť zoznamu y-ových súradníc.


  ; určenie počtu rôznych náhodných hodnôt početX a početY v závislosti od     počtu kvetov a počiatočného smeru
  ak2 :smer=0 [
    urobTu "početX celá (:počet+1)/2
    urobTu "početY 1+celá :počet/2
  ][
    urobTu "početX 1+celá :počet/2
    urobTu "početY celá (:počet+1)/2
  ]


Zoznam x-ových súradníc vytvoríme v závislosti od hodnôt x-ovej súradnice prvého kvetu (:x0), x-ovej súradnice koncového kvetu (:xn) a počtu rôznych x-ových súradníc (:početX). Jednotlivé hodnoty x-ových súradníc môžeme vytvoriť tak, že ich rovnomerné usporiadanie (s rovnakými vzdialenosťami susedných bodov) upravíme pripočítaním náhodného čísla, ktoré je nanavýš rovné štvrtine vzdialenosti pôvodného rovnomerného rozdelenia x-ových súradníc. Týmto by sme mali zabezpečiť neprekrývanie kvetov, ktorých veľkosť je nanajvýš rovná polovici zdialenosti pôvodného rovnomerného rozdelenia x-ových súradníc. Takto vytvoríme zoznam s :početX-2 prvkami, ktorý potom premiešame a doplníme na jeho začiatok súradnice prvého kvetu :x0 a na jeho koniec súradnice koncového kvetu dráhy :xn.


  ; vygenerovanie x-ových hodnôt uzlov dráhy
  urobTu "uzly_x []
  urobTu "i 0
  urobTu "dx :xn-:x0
  kým [počet :uzly_x<:početX-2][
    zvýš "i
    urobtu "x :x0 + (zaokruhli :i*:dx/:početX) +
              (zaokruhli náhodne :dx/:početX/4)
    urobTu "uzly_x vložPosledný :x :uzly_x
  ]
  urobTu "uzly_x pomiešaj :uzly_x
  urobTu "uzly_x vložPrvý :x0 :uzly_x
  urobTu "uzly_x vložPosledný :xn :uzly_x


Podobným spôsobom vytvoríme náhodný zoznam y-ových súradníc:


  ; vygenerovanie y-ových hodnôt uzlov dráhy
  urobTu "uzly_y []
  urobTu "i 0
  kým [počet :uzly_y<:početY-2][
    zvýš "i
    urobtu "y :y0 + (zaokruhli :i*:dy/:početY) +
              (zaokruhli náhodne :dy/:početY/4)
    urobTu "uzly_y vložPosledný :y :uzly_y
  ]
  urobTu "uzly_y pomiešaj :uzly_y
  urobTu "uzly_y vložPrvý :y0 :uzly_y
  urobTu "uzly_y vložPosledný :yn :uzly_y


Z vytvorených zoznamov s náhodnými x-ovými a y-ovými súradnicami môžeme zostaviť zoznam súradníc kvetov - uzlov pravouhlej lomenej čiary, a to pridávaní dvojíc nasledovných bodov. Pri zvislom smere prvý z dvojice pridávaných bodov má rovnakú x-ovú súradnicu ako predchádzajúci bod a inú y-ovú súradnicu ako predchádzajúci bod. Druhý bod z dvojice bude mať inú x-ovú súradnicu ako prvý bod dvojice a rovnakú y-ovú súradnicu ako prvý bod dvojice. Časť programu na zostavenie zoznamu súradníc kvetov (uložených v globálnej premennej "draha) môže vyzerať nasledovne:

 
  ; zostavenie dráhy
  ak :smer=0 [
    urob "draha (zoznam (zoznam :x0 :y0))
    opakuj :početX-1 [
      urob "draha vložPosledný zoznam (prvok poč :uzly_x)
                  (prvok poč+1 :uzly_y) :draha
      urob "draha vložPosledný zoznam (prvok poč+1 :uzly_x)
                  (prvok poč+1 :uzly_y) :draha
    ]
    ak :početX<>:početY [
      urob "draha vložPosledný zoznam (posledný :uzly_x) (posledný :uzly_y)                   :draha
    ]
  ]


V prípade vodorovného smeru doplníme program o nasledovnú časť:

 
  ak :smer=1 [
    urob "draha (zoznam (zoznam :x0 :y0))
    opakuj :početY-1 [
      urob "draha vložPosledný zoznam (prvok poč+1 :uzly_x)
                  (prvok poč :uzly_y) :draha
      urob "draha vložPosledný zoznam (prvok poč+1 :uzly_x)
                  (prvok poč+1 :uzly_y) :draha
    ]
    ak :početX<>:početY [
    urob "draha vložPosledný zoznam (posledný :uzly_x) (posledný :uzly_y)                 :draha
    ]
  ]


V procedúre na vykreslenie pretekárskej dráhy (lomenej čiary) sa postupne prechádza zoznamom súradníc dráhy (uložených v premennej "draha), mení poloha korytnačky na tieto súradnice, kde sa následne odtlačí tvar korytnačky (kvet):

viem kresliDráhu
  peroHore
  nechPoz prvý :draha
  peroDolu
  prePrvky "bod :draha [
    nechPoz prvok počítadlo :draha
    odtlač
  ]
koniec

Napokon do programu doplníme podmienky riešiteľnosti úlohy - ošetríme hodnoty vstupných parametrov (súradníce prvého a koncového bodu musia byť rôzne a musia sa zmestiť na obrazovku, počet kvetov musí byť aspoň 3, počet generovaných x-ových a y-ových súradníc musí byť taký, aby sa do danej obdlžníkovej oblasti zmestili všetky kvety bez dotyku, hodnota smeru je 0 - zvislý alebo 1 - vodorovný):


  ; ošetrenie vstupných parametrov
  urobTu "velkosťKvetu 12
  urobTu "dx :xn-:x0
  urobTu "dy :yn-:y0
  ak (alebo :x0=:xn :y0=:yn :x0>397 :y0>249 :xn>397 :yn>249
      :x0<-398 :y0<-249 :xn<-398 :yn-249 :počet<3       :početX*:velkosťKvetu>=(abs :dx)/2 :početY*:velkosťKvetu>=(abs :dy)/2       (zároveň :smer<>0 :smer<>1) ) [
    píš [Chybné parametre úlohy: aspoň jedna súradnica prvého a posledného          kvetu je rovnaká alebo súradnice krajných kvetov sú mimo obrazovku          počet kvetov je menší ako 3 alebo smer nie je žiadne z čísel {0,1}          alebo počet kvetov je veľký pre vybranú oblasť aby sa kvety          nedotýkali]
    ukonči
  ]


Po doplnení ošetrenia hodnôt vstupných parametrov dostaneme výslednú podobu procedúry vytvorDrahu:

viem vytvorDráhu :x0 :y0 :xn :yn :počet :smer
  ; určenie počtu rôznych náhodných hodnôt početX a početY v závislosti od     počtu kvetov a počiatočného smeru
  ak2 :smer=0 [
    urobTu "početX celá (:počet+1)/2
    urobTu "početY 1+celá :počet/2
  ][
    urobTu "početX 1+celá :počet/2
    urobTu "početY celá (:počet+1)/2
  ]

  ; ošetrenie vstupných parametrov
  urobTu "velkosťKvetu 12
  urobTu "dx :xn-:x0
  urobTu "dy :yn-:y0
  ak (alebo :x0=:xn :y0=:yn :x0>397 :y0>249 :xn>397 :yn>249
      :x0<-398 :y0<-249 :xn<-398 :yn-249 :počet<3       :početX*:velkosťKvetu>=(abs :dx)/2 :početY*:velkosťKvetu>=(abs :dy)/2       (zároveň :smer<>0 :smer<>1) ) [
    píš [Chybné parametre úlohy: aspoň jedna súradnica prvého a posledného          kvetu je rovnaká alebo súradnice krajných kvetov sú mimo obrazovku          počet kvetov je menší ako 3 alebo smer nie je žiadne z čísel {0,1}          alebo počet kvetov je veľký pre vybranú oblasť aby sa kvety          nedotýkali]
    ukonči
  ]

  ; vygenerovanie x-ových hodnôt uzlov dráhy
  urobTu "uzly_x []
  urobTu "i 0
  kým [počet :uzly_x<:početX-2][
    zvýš "i
    urobtu "x :x0 + (zaokruhli :i*:dx/:početX) +
              (zaokruhli náhodne :dx/:početX/4)
    urobTu "uzly_x vložPosledný :x :uzly_x
  ]
  urobTu "uzly_x pomiešaj :uzly_x
  urobTu "uzly_x vložPrvý :x0 :uzly_x
  urobTu "uzly_x vložPosledný :xn :uzly_x

  ; vygenerovanie y-ových hodnôt uzlov dráhy
  urobTu "uzly_y []
  urobTu "i 0
  kým [počet :uzly_y<:početY-2][
    zvýš "i
    urobtu "y :y0 + (zaokruhli :i*:dy/:početY) +
              (zaokruhli náhodne :dy/:početY/4)
    urobTu "uzly_y vložPosledný :y :uzly_y
  ]
  urobTu "uzly_y pomiešaj :uzly_y
  urobTu "uzly_y vložPrvý :y0 :uzly_y
  urobTu "uzly_y vložPosledný :yn :uzly_y

  ; zostavenie dráhy
  ak :smer=0 [
    urob "draha (zoznam (zoznam :x0 :y0))
    opakuj :početX-1 [
      urob "draha vložPosledný zoznam (prvok poč :uzly_x)
                  (prvok poč+1 :uzly_y) :draha
      urob "draha vložPosledný zoznam (prvok poč+1 :uzly_x)
                  (prvok poč+1 :uzly_y) :draha
    ]
    ak :početX<>:početY [
      urob "draha vložPosledný zoznam (posledný :uzly_x) (posledný :uzly_y)                   :draha
    ]
  ]
  ak :smer=1 [
    urob "draha (zoznam (zoznam :x0 :y0))
    opakuj :početY-1 [
      urob "draha vložPosledný zoznam (prvok poč+1 :uzly_x)
                  (prvok poč :uzly_y) :draha
      urob "draha vložPosledný zoznam (prvok poč+1 :uzly_x)
                  (prvok poč+1 :uzly_y) :draha
    ]
    ak :početX<>:početY [
    urob "draha vložPosledný zoznam (posledný :uzly_x) (posledný :uzly_y)                 :draha
    ]
  ]

  ; vykreslenie dráhy
  kresliDrahu

koniec

Náročnejšou podobou tejto úlohy by bolo, keby sa zadával aj parameter veľkosti kvetu, ktorý by sa odtláčal alebo vykresľoval.

Táto súťažná úloha je zameraná na použitie stratégií riešenia problémov - rozloženie problému do podproblémov, nakreslenie si obrázkov, dôsledný rozbor možných prípadov riešenia úlohy, a tiež na výpočty s karteziánskymi súradnicami, použitie príkazov opakovania, vetvenia, zložených podmienok (so spojkami zároveň, alebo), údajového typu jednoduchý aj vnorený zoznam, algoritmus generovania náhodných čísel podľa zadaných pravidiel.

Vaše zaujímavé riešenia a najčastejšie chyby

Do riešenia tejto úlohy sa zapojili 6 z 9 tímov finalového kola. Len jeden tím JM'&JM získal plný počet bodov. Celkové priemerné skóre tejto úlohy bolo 6 bodov, čo je cca 67%.

Nedostatky, ktoré sme našli v riešeniach súťažiacich:

  • vykresľovanie nesprávneho počtu kvetov, prípadne chýbal vstupný parameter určujúci počet kvetov,
  • generovanie len lomených čiar s prvým úsekom na východ, nie aj pre ostatné smery,
  • nesprávne generovanie dráhy, keď niektoré uhly neboli pravé,
  • nepoužitie zoznamu pre uloženie pretekárskej dráhy,
  • kreslenie kvetov aj mimo obdĺžnikovej plochy určenej prvým a koncovým kvetom,
  • žiadne alebo len čiastočné ošetrenie vstupných parametrov.