Выход из лабиринта - Pascal ABC
Формулировка задачи:
Помогите допилить.Нужен алгоритм нахождения выхода и лабиринта.За ранее спасибо!
Вот сам лабиринт:
Решение задачи: «Выход из лабиринта»
textual
Листинг программы
{ Лабиринт. Может ли путник выйти из лабиринта? Если может, то напечатать путь от выхода до начального положения путника. Лабиринт задан массивом A размером 40x40, в котором: A[k, m]=0, если клетка [k, m] "проходима"; A[k, m]=1, если клетка [k, m] "непроходима". Начальное положение путника задаётся в проходимой клетке [i, j]. Путник может перемещаться из одной проходимой клетки в другую, если они имеют общую сторону. Путник выходит из лабиринта, когда попадает в граничную клетку (то есть клетку [k, m], где k или m равны 1 или 40). } {$define NoInput}{данные для задачи не вводить, а взять из констант} program OLI833; const MM = 15; NN = 15; type TMaze = array [1..MM, 1..NN] of byte; var vyh: boolean; {$ifndef NoInput} m, n, i, j : Integer; A : TMaze; {$endif} {$ifdef NoInput} const m: integer = 5; n: integer = 5; i: integer = 3; j: integer = 3; A: TMaze = ( (1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 1} (0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 2} (1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 3} (1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 4} (1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 5} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 6} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 7} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 8} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), { 9} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {10} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {11} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {12} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {13} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {14} (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) {15} ); {$endif} procedure L(i, j: integer); begin if not vyh then if A[i, j] = 0 then begin if (i = 1) or (i = m) or (j = 1) or (j = n) then vyh := True; A[i, j] := 1; L(i, j - 1); L(i, j + 1); L(i - 1, j); L(i + 1, j); if vyh then WriteLn(i, ' ', j); end; end; begin {$ifndef NoInput} WriteLn('M, N:='); ReadLn(m, n); for i:=1 to m do for j:=1 to n do begin Write('A[', i, ',', j, ']:='); ReadLn(A[i, j]); end; WriteLn; WriteLn('I, J:='); ReadLn(i, j); WriteLn; {$endif} vyh := False; L(i, j); if not vyh then WriteLn('net vyhoda'); end.
Объяснение кода листинга программы
- Переменная
vyh
используется для отслеживания выхода из лабиринта. Изначально она установлена в значениеFalse
. - В начале программы заданы константы
m
иn
, представляющие размеры лабиринта. - Затем объявлен массив
A
типаTMaze
, который представляет собой лабиринт. - Далее, в блоке
{$ifndef NoInput}
, считываются данные для задачи из констант. - В цикле
for
считываются значения для каждой ячейки лабиринта и записывается в соответствующую ячейку массиваA
. - После этого, в блоке
{$endif}
, переменнойvyh
присваивается значениеTrue
, если путник вышел из лабиринта, иFalse
в противном случае. - Затем вызывается процедура
L
, которая выполняет следующие действия:- Проверяет, был ли выход из лабиринта.
- Если выход произошел, то записывает координаты выхода в экран.
- Если выход не произошел, то переходит к следующему шагу, который проверяет, можно ли перейти из текущей ячейки в соседнюю.
- Если можно, то переходит к следующей процедуре
L
, которая повторяет предыдущие действия. - Если выход из лабиринта не произошел после перехода в соседнюю ячейку, то записывает в экран сообщение
net vyhoda
.
- В конце программы выводится сообщение
M, N:=
, затем считываются значения дляm
иn
из ввода пользователя. - Затем вызывается цикл
for
, который повторяется для каждой ячейки лабиринта и записывает в нее значение из массиваA
. - После этого вызывается процедура
L
для текущей ячейки. - Если выход из лабиринта произошел, то выводится сообщение
I, J:=
, затем считываются значения дляi
иj
из ввода пользователя. - Затем выводится сообщение
net vyhoda
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д