diff --git a/sk1a/README.md b/sk1a/README.md new file mode 100644 index 0000000..b6fd4f6 --- /dev/null +++ b/sk1a/README.md @@ -0,0 +1,45 @@ +Zadanie + + 1A. Bludisko + + Potkan sa vie pohybovať po štvorcoch hore,dole, doprava i doľava. Bludisko je tvorené štvorcovou mriežkou rozmeru N x N. V bludisku sa nachádzajú prekážky vyznačené 'x'. Potkan pri pohybe nesmie naraziť do žiadnej prekážky. + Počiatočná pozícia potkana je v ľavom hornom rohu mriežky vyznačená '*'. + Vašou úlohou bude zobraziť optimálnu cestu pre potkana v bludisku. Cestu potkana vyznačte '*'. + + Implementujte funkciu: + + int solve_maze(char* maze,int size); + + maze je jednorozmerné pole do ktorého je uložená mriežka po riadkoch za sebou. Na začiatku poľa sa nachádza prvý riadok mriežky, za ním nasleduje druhý a tak ďalej. Spolu sa v poli maze nachádza size * size znakov. + Vašou úlohou bude modifikovať pole maze tak, aby ste v ňom vyznačili cestu z bludiska čo sa nachádza v pravom dolnom rohu bludiska. + +Riešenie + + Moja implementácia zahŕňa algoritmus, ktorý postupne prehľadáva cesty v bludisku. Pred začatím si bludisko vo forme jednorozmerného poľa s dlžkou jedného riadka pretvoríme do + dvojrozmerného poľa pre ľahšiu manipuláciu so súradnicami v priestore. Samotný algoritmus pozostáva z nekonečného cyklu, v ktorom sa rozhoduje o ďalšom kroku potkana. + + Potkan sa prepína medzi dvoma módmi prehľadávania, t.j. prehľadávanie novej cesty v bludisku alebo vracanie sa k najbližšej križovatke. Do módu prehľadávania sa dostane ak má možnosť + urobiť krok na nepreskúmané políčko. Tieto nepreskúmané možné políčka skontroluje na začiatku cyklu, kedy si vyberá smer kroku. Pri nájdení voľného a nepreskúmaného smeru poznačí + aktuálnu pozíciu za preskúmanú a posunie sa do nájdeného smeru. Na novej pozícii si poznačí smer, z ktorého prišiel. V prípade, že voľný smer nenájde, prečíta informáciu z ktorého + smeru prišiel z aktuálnej pozície a vráti sa na predošlú. Pri vracaní sa po označenej ceste ide o mód vracania sa k najbližšej križovatke. + + Potkan si označuje políčka zanechávaním čísiel na danej pozícií. Každá číslica obsahuje informácie o preskúmaní a smeru pre vrátenie sa. Reprezentácia informácií v čísle vyzerá + následovne: + + | 128 | 64 | 32 | 16 | | 8 | 4 | 2 | 1 | + |-----|----|----|------------|---|---------------|---------|------|--------| + | | | | preskúmané | | prišiel z/zo: | | | | + | | | | políčko | | severu | východu | juhu | západu | + + Po urobení kroku dopredu/späť sa porovná aktuálna pozícia s koncovou/štartovnou, pri zhode sa cyklus ukončí. Vrátením sa na štartovnú pozíciu sa riešenie nenašlo, v opačnom prípade + z bludiska odstránia pomocné čísla a vyznačí sa cesta. + + Pred pretvorením pomocného dvojrozmerného poľa bludiska do pôvodného tvaru sa ešte skontrolujú redundatné kroky cesty, z ktorých sa vytvoria "skratky" - znázornené na príklade: + + bez kontroly: * x x x s kontrolou: * x x x + * * x * x + * * x x * x x + * x * * * * x * * * + * * * x * * * * x * + + znázornená kontrola spočíva v hľadaní štvorcových ciest a odstránením pravej polovice cesty, kedže algoritmus hľadá nové smery kroku v poradí DOPRAVA, DOLE, doľava, dohora. \ No newline at end of file