Programozó versenyek

DEIK Regionális Programozó Csapatverseny, középiskolai kategória, 2017. december 3.

2017. december 3. 10:10 – 2017. december 3. 15:10

H — Erdőrajz

A „Rajzolj erdőt!” nevű játék igencsak népszerű a vidámparkunk legifjabb látogatói körében. A játék résztvevőinek száma lényegében korlátlan, és csaknem mindenki nyer. A játék roppant egyszerű. A játékvezető először röviden leír egy képet egy olyan erdőről, ahol nemrég megfordult. A játékosok ezután kapnak papírt és színes ceruzát, és a legjobb tudásuk szerint reprodukálniuk kell a képet. Bárki, aki be tud mutatni akár csak egy képrészletet egy, a Föld tetszőleges pontján lévő erdő tetszőleges részéről tetszőleges stílusban, kap egy kis jutalmat: csokoládét vagy gyümölcsöt.

Ebben a feladatban ennek a játéknak az imitációját kell leprogramozni. Mivel te sokkal tapasztaltabb vagy, mint a fiatal játékosok, a te rajzodnak pontosan meg kell felelnie a specifikációknak. A reprodukálandó kép egy tisztást ábrázol, azaz egy olyan nyílt területet egy erdős vidéken, amely kevésbé telített fákkal, mint a környező sűrű erdő. A képet „ASCII art” stílusban kell elkészíteni.

Egy M × M-es képet egy M sorból álló „vászonnal” reprezentálunk, ahol minden sor M karaktert tartalmaz. A vásznon a kép minden pixelét valamilyen nyomtatható ASCII karakterrel adjuk meg. A kép egyes pixeleinek a koordinátái megfelelnek a vásznon lévő karakterek koordinátáinak. A kép bal alsó sarkában és a jobb felső sarkában lévő pixelek koordinátái rendre (0, 0) és (M – 1, M – 1). A kép jobb alsó sarkában lévő pixel x koordinátája M – 1.

A kép minden pixele jelölhet füvet, illetve egy álló fának vagy egy fatuskónak egy darabját. Egy füvet jelölő pixelt a vásznon egy pont karakterrel („.”, ASCII-kódja: 46) adunk meg. Az álló fákat és a fatuskókat több pixel írja le, ezek reprezentációja olvasható a következőkben.

Egy álló fának van egy pozitív S magassága, és négy részből áll: a gyökérzetből, a fatörzsből, az ágakból és a koronából. A gyökérzetet három vízszintesen szomszédos karakter írja le: aláhúzásjel, függőleges vonal, aláhúzásjel („_|_”, ASCII-kódjaik: 95, 124, 95). A fatörzset S darab függőlegesen szomszédos függőleges vonal („|”, ASCII-kódja: 124) reprezentálja, amely közvetlenül a gyökérzet középpontja felett helyezkedik el. Az ágakat S darab bal oldali ág és S darab jobb oldali ág alkotja, amelyek közvetlenül a fatörzs bal, illetve jobb oldalán állnak. Minden ág szomszédos a fatörzzsel. A bal oldali ágakat egy-egy perjel karakterrel („/”, ASCII-kódja: 47), a jobb oldali ágakat pedig egy-egy visszaper karakterrel („\”, ASCII-kódja: 92) írjuk le. A koronát egy kalap karakter („^”, ASCII-kódja: 94) reprezentálja, amely közvetlenül a fatörzs legfelső karaktere felett helyezkedik el.

Egy fatuskó három vízszintesen szomszédos pixelből áll, amelyeket az aláhúzás, a kis „o” betű és egy újabb aláhúzás karakter jelöl („_o_”, ASCII-kódjaik: 95, 111, 95).

Ügyeljünk rá, hogy egy álló fa vagy egy fatuskó a képen esetleg csak részben látható vagy egyáltalán nem látható, a koordinátáitól függően. Ennek illusztrálását lásd a példa kimeneten!

A bemenet specifikációja

A bemenet számos tesztesetet tartalmaz. Minden teszteset egy olyan sorral kezdődik, amelyben két egész szám (M és N) áll egy szóközzel elválasztva (1 ≤ M ≤ 100, 1 ≤ N ≤ 105). Ezt N sor követi, amelyek mindegyike három, szóközzel elválasztott egész számból (S, X és Y) áll, amelyek egy-egy álló fát vagy fatuskót írnak le. X és Y értékei vagy a gyökérzet, vagy a fatuskó középpontjának a koordinátáit adják meg. Ha S = 0, akkor a számhármas egy fatuskót ír le, ha pedig S > 0, akkor egy S magasságú álló fát. Ezekre az értékekre 0 ≤ S ≤ 9, valamint –109 ≤ XY ≤ 109 teljesül.

Két különböző álló fa vagy fatuskó garantáltan nem takarják ki egymást, azaz minden darabjukat más-más pixel fogja leírni.

A kimenet specifikációja

Minden tesztesetre a tisztás képét leíró vásznat kell a kimenetre írni. A vászon felső sora legyen a kép elsőnek kiírt sora, a vászon alsó sora pedig a kép utolsóként kiírt sora! A képet egy csillag karakterekből („*”, ASCII-kódja: 42) álló, négyzet alakú kerettel kell díszíteni, amelynek a vastagsága egy pixel. A keret szorosan ölelje körül a vásznat, azaz ne álljon szóköz a keret és a vászon között, sem vízszintesen, sem függőlegesen! Minden teszteset után álljon egy-egy üres sor a kimeneten!

Példa bemenet

  1. 3 2
  2. 0 5 5
  3. 9 1 0
  4. 8 10
  5. 3 3 2
  6. 0 2 1
  7. 1 -1 -1
  8. 0 -1 2
  9. 3 0 6
  10. 6 4 7
  11. 0 7 4
  12. 3 8 -1
  13. 5 5 -5
  14. 9 2 -10
letöltés szöveges állományként

A példa bemenethez tartozó kimenet

  1. *****
  2. */|\*
  3. */|\*
  4. *_|_*
  5. *****
  6. **********
  7. *|\._|_..*
  8. *|_.^....*
  9. *../|\...*
  10. *../|\._o*
  11. *../|\...*
  12. *_._|_../*
  13. *._o_.^./*
  14. *\.^./|\/*
  15. **********
letöltés szöveges állományként
Debreceni Egyetem, Informatikai Kar, v. 2019.03.01.