usaa21/sk1a
Peter Petrek b8fb261544 .
2022-01-19 17:41:10 +01:00
..
main.c first 2022-01-14 02:01:07 +01:00
main.o . 2022-01-19 17:41:10 +01:00
Makefile . 2022-01-19 17:41:10 +01:00
maze.c . 2022-01-19 17:41:10 +01:00
maze.h first 2022-01-14 02:01:07 +01:00
maze.o . 2022-01-19 17:41:10 +01:00
program . 2022-01-19 17:41:10 +01:00
README.md readme 2022-01-19 17:28:26 +01:00

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.