Autorské riešenie
[stiahni]

Pri zavlažovaní poľa tryskami (označení zavlažených políčok) môžeme postupovať dvoma spôsobmi:

  1. Nájdeme postupne všetky trysky v celom poli a pri každej tryske vylejeme vodu na všetky políčka v riadku a stlpci, v ktorom je umiestnená tryska.
  2. Postupne prechádzame najprv všetkými stĺpcami a potom všetkými riadkami a vylievame do nich vodu, ak v danom stĺpci, resp. riadku sa nachádza aspoň jedna tryska.

V tomto autorskom riešení sme si vybrali druhý spôsob riešenia. Pri prechode poľom po zvislých a vodorovných radoch bude užitočné naprogramovať procedúru zalievajRad. Pomocou nej prejdeme najprv radom políčok, pričom budeme zisťovať, či v danom rade sa nachádza tryska. Potom pri ceste radom naspäť na začiatok radu budeme navyše zalievať (farbiť namodro) všetky suché (žlté) políčka, ak v danom rade bola zistená tryska.

pole - sposob zavlazovania

Pri jednom spôsobe riešenia môžeme v procedúre zalievajRad využiť skôr zistené informácie o počte políčok celého poľa na šírku a na výšku. V našom riešení nebudeme potrebovať zisťovať počet políčok, ale budeme prechádzať radom políčok pokiaľ nenarazíme na bielu farbu, ktorou je ohraničené celé pole. Ak počas prechodu radom políčok zistíme, že sa tam vyskytla tryska (políčko s hnedou farbou), tak pri spiatočej ceste zafarbíme všetky suché políčka modrou farbou. Ak tam tryska nebola, tak pri ceste naspäť na začiatok radu nebudeme zafarbovať žiadne políčka.

Pred programovaním procedúry zalievajRad je užitočné vytvoriť procedúru navratNaZaciatokRadu na presunutie sa na zažiatok radu, ktorá môže vyzerať takto:

viem navratNaZaciatokRadu

  ; prejde sa naspat radom a zastane sa na 1. policku radu
  kym [farbaBodu<>"biela] [
    vz 20
  ]
  do 20

koniec

Procedúra zalievajRad na zaliatie jedného radu môže vyzerať nasledovne:

viem zalievajRad

  ;zisti sa pri priamom prechode radom kolko je tam trysiek
  urobTu "pocetTrysiek 0
  kym [farbaBodu<>"biela] [
    ak farbaBodu="hneda8 [
      zvys "pocetTrysiek
    ]
    do 20
  ]

  ;prechod nadol, ak su tam trysky, tak zlte policka zafarbi svetlomodrou
  vz 20
  nechFV "modra8
  ak2 :pocetTrysiek=0 [
    navratNaZaciatokRadu
  ][
    kym [farbaBodu<>"biela] [
      ak farbaBodu="zlta8 [
        vypln
      ]
      vz 20
    ]
    do 20
  ]

koniec

S využitím procedúry zalievajRad môžme pomerne ľahko vytvoriť procedúru zalievajRady, pomocou ktorej prejdeme celým poľom v jednom smere a zalejeme suché políčka v radoch, kde sa vyskytuje tryska. Procedúra zalievajRady môže vyzerať napr. takto:

viem zalievajRady

  ;zaleju sa vsetky suche (zlte) policka v priamom smere
  kym [farbaBodu<>"biela] [
    zalievajRad
    vp 90
    do 20
    vl 90
  ]

koniec

Ak bola korytnačka natočená nahor, tak pomocou procedúry zalievajRad sme zaliali (označili modrou farbou) všetky políčka celého poľa zalievané vo zvislom smere všetkými tryskami. Ostáva nám zaliať (označiť modrou farbou) políčka celého poľa zalievané vo vodorovnom smere všetkými tryskami. Toto vodorovné zaliatie môžme urobiť rovnakým spôsobom ako zvislé zaliatie pomocou procedúry zalievajRady, len sa musíme nastaviť do pravého dolného rohu poľa a natočiť sa v smere doľava. Potom už môžme napísať procedúru zalievajPlochu, pomocou ktorej označíme políčka celého poľa zaliate tryskami vo zvislom aj vodorovnom smere. Procedúra zalievajPlochu môže vyzerať takto:

viem zalievajPlochu

  ; zaleju sa vsetky suche (zlte) policka najprv vo zvislom smere
  zalievajRady
  vl 90
  do 20

  ; zaleju sa vsetky suche (zlte) policka najprv vo vodorovnom smere
  zalievajRady

koniec

Ak sa chceme nastaviť na pôvodné miesto poľa v ľavom dolnom rohu, tak vytvoríme procedúru navratNaZaciatokPola, ktorá môže vzyerať takto:

viem navratNaZaciatokPola

  ; z miesta mimo pola sa presunie na policko v pravom horom rohu
  vp 90
  vz 20

  ; prejde sa do praveho dolneho rohu pola
  navratNaZaciatokRadu
  vp 90

  ; prejde sa na zaciatok pola = do laveho dolneho rohu pola
  navratNaZaciatokRadu
  vl 90

koniec

Procedúra zalievajPlochu s návratom na prvé políčko môže vyzerať nasledovne:

viem zalievajPlochu

  ; zaleju sa vsetky suche (zlte) policka najprv vo zvislom smere
  ; korytnacka bude stat vedla pola vpravo na urovni 1. riadku pola
  zalievajRady
  vl 90
  do 20

  ; zaleju sa vsetky suche (zlte) policka najprv vo vodorovnom smere
  ; korytnacka bude stat vedla pola hore na urovni posledneho stlpca pola
  zalievajRady

  ; presunie sa na poziciu 1. riadku a 1. stlpca pola = lavy dolny roh pola
  navratNaZaciatokPola

koniec

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

Úlohu riešilo 14 tímov, z toho 6 mali plný počet bodov. Väčšina správnych riešení použilo prvý spôsob riešenia, t. j. prechádzanie celým poľom a pri narazaní na trysku vyfarbenie riadku a stĺpca modrou farbou. Pri niektorých riešeniach ste vypočítali šírku a výšku poľa, čo vám trochu uľahčilo prechádzanie celým poľom. Pri dvoch riešeniach ste použili rekurziu, čo nebolo nutné, ale ste aspoň ukázali, resp. neukázali, že viete napísať rekurzívny program. Veľmi pekné riešenie uviedol súťažiaci Michal Bali a tiež lupa, ktorý navyše veľmi dôzledne použil komentáre vo svojom riešení. Niektorí ste vo svojich riešeniaćh nepoužívali procedúry, čo v niektorých prípadoch zneprehľadnilo kód, prípadne niektoré časti kódu sa opakovali. Pri zopár riešeniach ste prechádzali 20 riadkami a 20 stĺpcami nezávisle od aktuálneho rozmeru poľa.