Выход из лабиринта - 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.

Объяснение кода листинга программы

  1. Переменная vyh используется для отслеживания выхода из лабиринта. Изначально она установлена в значение False.
  2. В начале программы заданы константы m и n, представляющие размеры лабиринта.
  3. Затем объявлен массив A типа TMaze, который представляет собой лабиринт.
  4. Далее, в блоке {$ifndef NoInput}, считываются данные для задачи из констант.
  5. В цикле for считываются значения для каждой ячейки лабиринта и записывается в соответствующую ячейку массива A.
  6. После этого, в блоке {$endif}, переменной vyh присваивается значение True, если путник вышел из лабиринта, и False в противном случае.
  7. Затем вызывается процедура L, которая выполняет следующие действия:
    • Проверяет, был ли выход из лабиринта.
    • Если выход произошел, то записывает координаты выхода в экран.
    • Если выход не произошел, то переходит к следующему шагу, который проверяет, можно ли перейти из текущей ячейки в соседнюю.
    • Если можно, то переходит к следующей процедуре L, которая повторяет предыдущие действия.
    • Если выход из лабиринта не произошел после перехода в соседнюю ячейку, то записывает в экран сообщение net vyhoda.
  8. В конце программы выводится сообщение M, N:=, затем считываются значения для m и n из ввода пользователя.
  9. Затем вызывается цикл for, который повторяется для каждой ячейки лабиринта и записывает в нее значение из массива A.
  10. После этого вызывается процедура L для текущей ячейки.
  11. Если выход из лабиринта произошел, то выводится сообщение I, J:=, затем считываются значения для i и j из ввода пользователя.
  12. Затем выводится сообщение net vyhoda.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы