2 - Crtanje brojeva
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
100ms | 16MB |
Anitica je naučila da crta ali ne i da piše, no za Zimske olimpijske igre želi da bodri naše ekipe tako što će ispisati njihova imena na snegu. Za početak želi da nauči da piše cifre, a sledeće nedelje će raditi na slovima. Načula je da je najlakši način da to nauči je da prvo crta cifre crticama, slično kao na digitalnom displeju. Za tu svrhu je izabrala papir na kvadratiće kako bi lakše povlačila crtice.
Na početku Anitica spusti vrh olokve na bilo koji čvor na papiru. Nakon toga prati komande kako bi iscrtala cifre, pri čemu komande mogu biti:
- 'U' - pomerajnje oloke gore za jednu crticu
- 'L' - pomeranje olovke levo za jednu crticu
- 'D' - pomeranje olovke dole za jednu crticu
- 'R' - pomeranje olokve desno za jednu crticu
- '_' - spuštanje olovke na papir
- '^' - podizanje olokve sa papira.
Kako bi joj olakšali proveru rezultata, rešili smo da napišemo program koji za zadatu listu komandi vraća cifru koje one ispisuju. Izgled cifara na digitalnom displeju:
Ulaz
Prvi red standardnog ulaza sadrži prirodni broj \(N\), koji predstavlja broj cifara koje treba proveriti. Narednih \(N\) redova sadrže po jedan string koji opisuje niz komandi. Komande za svaku cifru se izvršavaju redosledom kojim su zadate.
Izlaz
U prvom i jedinom redu standardnog izlaza štampati niz od \(N\) cifara, koje su odvojene po jednim znakom razmaka. Cifre predstavljaju rezultate nizova komandi u redusledu iz ulaza.
Primer 1
Ulaz
Izlaz
Ograničenja
- \(1\leq N \leq 10\).
- Dužina niza komandi, odnosno stringova iz ulaza, nije veća od \(1000\).
- Ishod svakog niza komandi predstavlja validnu cifru. Ulaz će uvek sadržati regularni niz komandi.
- Izgled cifara je dat na slici u tekstu problema.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Andreja Ilić | Andreja Ilić | Andreja Ilić | Dušan Zdravković |
Na prvi pogled, odnosno u našem slučaju na prvo čitanje, problem deluje jednostavno. Međutim, pri malo detaljnijoj analizi ili pri pokušaju implementacije mogu se uočiti određeni specijalni slučajevi koji nam, ukoliko se o njima dobro ne razmisli, mogu “zagorčati život“.
Kako je ograničenje za dužinu niza komandi malo - simulacija se prosto nameće. Nakon simulacije imamo “sliku” koju treba uporediti sa slikama svih cifara. Kao rezultat vraćamo cifru čija se slika poklopila sa slikom koju smo dobili simulacijom. Zato se postavlja pitanje kako izvršiti samu simulaciju? U zadatku Anitica crta po ivicama rešetke, tako da ukoliko bi papir modelirali matricom potrebno je naći način markiranja ivica a ne polja matrice. Samo markiranje i ne predstavlja veliki problem, ali kasnije moramo tu sliku upoređivati sa slikama drugih cifara, što može biti problem.
Zato se možemo poslužiti trikom da papir modeliramo matricom, ali da se potez simulira tako što markiramo tri polja matrice (u datom smeru). Naime, u svakom trenutku pamtimo trenutnu poziciju na kojoj se nalazi olovka. Označimo koordinate trenutne pozicije sa \((currentX, currentY)\). Ukoliko je, na primer, naredna komanda povlačenje olovke desno, tada polja \((currentX, currentY)\), \((currentX, currentY+1)\) i \((currentX, currentY+2)\) treba obojiti ukoliko je olovka na papiru. Za pamćenje stanja olovke, da li je na papriru ili u vazduhu, možemo koristiti običnu boolean promenjivu koja menja vrednosti kada naiđe na odgovarajuće komande.
Simulacija primera sa papira. Crno polje predstavalja poziciju olovke kada je ona spuštena, a sivo polje kada je u vazduhy:
Kako znamo da će na kraju iscrtana slika predstavljati neku od deset cifara (uslov zadatka), naša simulacija ne može “nacrtati” sliku dimenzija većih od \(6\times 3\). Nažalost, kako iz samog problema ne znamo tačnu poziciju iz koje Anitica kreće da crta (primera radi ne znamo da ona uvek kreće iz gornjeg-desnog ugla), našu simulaciju možemo započeti iz sredine matrice. Ovde se krije jedan mali problem. Naime, ukoliko samu simulaciju vršimo tako što se uvek krećemo po poljima matrice, onda matrica mora biti veoma velika. Ali mi znamo da je deo matrice koji je nama bitan, deo na kome su oboje polja, ne može biti veći od gore navedene dimenzije, mi onda možemo vršiti simulaciju samo kada je olovka na papiru. Kada je olovka u vazduhu mi možemo samo da menjamo vrednosti trenutne pozicije u matrici. U trenucima kada je olovka na papiru, pored menjanja trenutne pozicije, polja kroz koja prolazimo treba markirati (odnosno obojiti).
Sada znamo da je potrebno definisati malu matricu koja će nam služiti za simulaciju, ali se postavlja pitanje kolika dimenzija te matrica je potrebna? Gore smo spomenuli da mi ne znamo u kome smeru će Anitica crtati cifre, tako da kada krenemo simulaciju iz sredine matrice, ne znamo da li će Anitica nastaviti crtanje dole desno ili gore levo ili samo dole. Zbog toga možemo definisati matricu koja može prihvatiti cifre u svim pravcima. Iz ove analize možemo zaključiti da je dovoljno matricu definisati sa dimenzijama \((3+3)\times (6+6)\).
Nažalost, u ovoj analizi nam se podkrao još jedan specijalni slučaj – šta ako prva komanda predstavlja podizanje olovke u vazduh. Ukoliko krenemo slimulaciju odmah, može se desiti da prvi trenutak kada Anitica spisti olovku bude mnogo izvan opsega naše matrice. Ono što mi znamo jeste da čim povuče prvu crticu, onda će ostatak slike biti blizu te crtice. Zato je na početku potretrebno zanemariti deo pre prve crte koju povuče Anitice. Ovo zapravo predstavlja početni deo niza komndati koji se dešava “u vazduhu”.
Slike cifara:
### # ### ### # # ### ### ### ### ###
# # # # # # # # # # # # # #
# # # ### ### ### ### ### # ### ###
# # # # # # # # # # # # #
### # ### ### # ### ### # ### ###
Generalizacija
Dve generalizacije ovogo problema su bile razmatrane za ovo takmičenje. Prva je da cifre koje crta Anitica mogu biti sklirane, drugim rečima onda može nacrtana broj jedan veličine 15 uzastopnih crtica na gore ili na dole. Ovde bi prepoznavanje samih cifara bilo dosta komplikovanije, jer nije dovoljno ipitivati samo puku jednakost dve podmatrice.
Druga generalizacije je bila ukoliko cifre nisu skalirane, ali Anitica može da pogreši i da nacrta bilo šta. Ovo bi upoređivanje bilo identično kao i u početnoj verziji problema ali bi bilo potrebno ubaciti još neke specijalne slučajeve u anazizu. Ovi specijalni slučajevi bi služili da nam pomognu u odluci da li da nastvimo simulaciju ili ne – na primer ukoliko Anitica počne da šara po papiru svuda čime se dobija velika slika koja svakako nije cifra.
02_crtanje_brojeva.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
|