25.07.2017 Views

Intro-CSharp-Book-v2015

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Глава 10. Рекурсия 377<br />

Found the exit!<br />

Found the exit!<br />

Вижда се, че изходът е бил намерен точно 3 пъти. Изглежда алгоритъмът<br />

работи коректно. Липсва ни обаче отпечатването на самия път като последователност<br />

от позиции.<br />

Пътища в лабиринт – запазване на пътищата<br />

За да можем да отпечатаме пътищата, които намираме с нашия рекурсивен<br />

алгоритъм, можем да използваме масив, в който при всяко придвижване<br />

пазим посоката, която сме поели (L – наляво, U – нагоре, R – надясно, D –<br />

надолу). Този масив ще съдържа във всеки един момент текущия път от<br />

началото на лабиринта до текущата позиция.<br />

Ще ни трябва един масив от символи и един брояч на стъпките, които<br />

сме направили. Броячът ще пази колко пъти сме се придвижили към<br />

следваща позиция рекурсивно, т.е. текущата дълбочина на рекурсията.<br />

За да работи всичко коректно, е необходимо преди влизане в рекурсия да<br />

увеличаваме брояча и да запазваме посоката, която сме поели в текущата<br />

позиция от масива, а при връщане от рекурсията – да намаляваме брояча.<br />

При намиране на изхода можем да отпечатаме пътя – всички символи от<br />

масива от 0 до позицията, която броячът сочи.<br />

Колко голям да бъде масивът? Отговорът на този въпрос е лесен; понеже в<br />

една клетка можем да влезем най-много веднъж, то никога пътят няма<br />

да е по-дълъг от общия брой клетки в лабиринта (N*M). В нашия случай<br />

размерът е 7*5, т.е. достатъчно е масивът да има 35 позиции.<br />

Следва една примерна имплементация на описаната идея:<br />

static char[,] lab =<br />

{<br />

{' ', ' ', ' ', '*', ' ', ' ', ' '},<br />

{'*', '*', ' ', '*', ' ', '*', ' '},<br />

{' ', ' ', ' ', ' ', ' ', ' ', ' '},<br />

{' ', '*', '*', '*', '*', '*', ' '},<br />

{' ', ' ', ' ', ' ', ' ', ' ', 'е'},<br />

};<br />

static char[] path =<br />

new char[lab.GetLength(0) * lab.GetLength(1)];<br />

static int position = 0;<br />

static void FindPath(int row, int col, char direction)<br />

{<br />

if ((col < 0) || (row < 0) ||<br />

(col >= lab.GetLength(1)) || (row >= lab.GetLength(0)))<br />

{

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!