program PasseioCavalo;
const n = 8; { Tamanho do lado do tabuleiro }
type indice = 1..n;
var i, j: integer;
    t: array[indice, indice] of integer;
    q: boolean;
    s: set of indice;
    a, b: array[indice] of integer;

procedure Tenta (i: integer; x,y: indice; var q: boolean);
var u, v, k: integer; q1: boolean;
begin
  k := 0;  { inicializa selecao de movimentos }
  repeat
    k := k + 1; q1 := false;
    u := x + a[k]; v := y + b[k];
    if (u in s) and (v in s)
    then if t[u,v]=0
         then begin
              t[u,v] := i;
              if i < n * n { tabuleiro nao esta cheio }
              then begin
                   Tenta (i+1, u, v, q1); { tenta novo movimento }
                   if not q1
                   then t[u,v] := 0 { nao sucedido apaga reg. anterior }
                   end
              else q1 := true;
              end;
  until q1 or (k = 8); { nao ha mais casas a visitar a partir de x,y }
  q := q1;
end;

begin { programa principal }
  s := [1,2,3,4,5,6,7,8];
  a[1] := 2;  a[2] := 1;  a[3] :=-1; a[4] :=-2;
  b[1] := 1;  b[2] := 2;  b[3] := 2; b[4] := 1;
  a[5] := -2; a[6] := -1; a[7] := 1; a[8] := 2;
  b[5] := -1; b[6] := -2; b[7] :=-2; b[8] := -1;
  for i:= 1 to n do for j:= 1 to n do t[i,j] := 0;
  t[1,1] := 1; { escolhemos uma casa do tabuleiro }
  Tenta(2,1,1,q);
  if q
  then for i:=1 to n do
         begin for j:=1 to n do write(t[i,j]:4); writeln; end
  else writeln('Sem solucao');
end.


