program labyrinth_suchen;
uses crt;

type labypkt = 0..3;  {0=Mauer, 1=frei, 2=m”gl. Weg, 3=richtiger Weg}

const xsize = 22; ysize = 22;

const labyrinth : array[1..ysize, 1..xsize] of labypkt =
                ((0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0),
                 (0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 (0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1),
                 (0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0),
                 (0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0),
                 (0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0),
                 (0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1),
                 (0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1),
                 (0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1),
                 (0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1),
                 (0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
                 (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0),
                 (0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 (0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1),
                 (0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0),
                 (0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0),
                 (0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0),
                 (0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1),
                 (0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1),
                 (0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1),
                 (0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1),
                 (0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));

var gefunden: boolean;

procedure laby_ausgabe;

  var x, y: byte;

  begin
    gotoxy(1, 1);
    for y:=1 to ysize do
      for x:=1 to xsize do
        begin
          textcolor(labyrinth[y, x]+1);
          write('Û');
          if x=xsize then writeln;
        end;
    textcolor(7);
    delay(200);
  end;

procedure laby_weg(xs, ys, xz, yz: byte; var gefunden: boolean);
                       {xs, ys: Start/aktuell; xz, yz: Ziel}
                       {xv, yv: wo vorw„rts}

  var x, y, ort: byte;

  begin
    x:=xs; y:=ys;
    if ((x<=xsize) and (y<=ysize)) then
     if (labyrinth[y, x]>0) and (labyrinth[y, x]<2) then
      begin
        write(x, ' ', y, ' ', labyrinth[y, x]);
        inc(labyrinth[y, x]);
        laby_ausgabe;
        if ((x=xz) and (y=yz)) then gefunden:=true;
        if not(gefunden) then
          laby_weg(x, y+1, xz, yz, gefunden);
        if not(gefunden) then
          laby_weg(x, y-1, xz, yz, gefunden);
        if not(gefunden) then
          laby_weg(x+1, y, xz, yz, gefunden);
        if not(gefunden) then
          laby_weg(x-1, y, xz, yz, gefunden);
        if gefunden then inc(labyrinth[y, x]);
      end;
  end;

begin
  clrscr;
  laby_ausgabe;
  gefunden:=false;
  laby_weg(2, 1, 6, 22, gefunden);
  laby_ausgabe;
  readln;
end.
