25.07.2017 Views

Intro-CSharp-Book-v2015

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Проверка на идеята<br />

Глава 24. Практически изпит по програмиране (тема 1) 1019<br />

Изглежда имаме идея за решаване на задачата: с рекурсивно обхождане<br />

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

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

Нека да проверим идеята.<br />

Взимаме лист хартия и си правим един примерен лабиринт. Пробваме<br />

алгоритъма. Вижда се, че той намира всички пътища от началната клетка<br />

до някой от изходите, като доста обикаля напред-назад. В крайна сметка<br />

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

Дали идеята работи, ако няма изход? Правим си втори лабиринт, който е<br />

без изход. Пробваме алгоритъма върху него, отново на лист хартия. Виждаме,<br />

че след доста обикаляне напред-назад алгоритъмът не намира нито<br />

един изход и приключва.<br />

Изглежда имаме правилна идея за решаване на задачата. Да преминем<br />

напред и да помислим за структурите от данни.<br />

Какви структури от данни да използваме?<br />

Първо трябва да преценим как да съхраняваме лабиринта. Съвсем естествено<br />

е да ползваме матрица от символи, точно като тази на картинката. Ще<br />

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

символ, различен от символа 'x'. Може да пазим лабиринта и в матрица с<br />

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

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

Няма много възможности за избор. Ще съхраняваме лабиринта в матрица<br />

от символи.<br />

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

момента клетки по време на рекурсията (текущия път). На нас ни трябва<br />

винаги последната обходена клетка. Това ни навежда на мисълта за<br />

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

Можем да ползваме Stack, където Cell е клас, съдържащ координатите<br />

на една клетка (номер на ред и номер на колона).<br />

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

да извлечем накрая най-късия от тях. Ако се замислим малко, не е нужно<br />

да пазим всички пътища. Достатъчно е да помним текущия път и най-късия<br />

път за момента. Дори не е необходимо да пазим най-късия път за момента,<br />

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

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

дължина за момента, да я запомняме.<br />

Изглежда намерихме ефективни структури от данни. Според препоръките<br />

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

програмата, защото трябва да помислим за ефективността на алгоритъма.

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

Saved successfully!

Ooh no, something went wrong!