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 />
програмата, защото трябва да помислим за ефективността на алгоритъма.