(* Find a path of a knight on a chess board which
  covers all 64 squares. *)

MODULE knightstour;

FROM  InOut IMPORT WriteCard, WriteString, WriteLn;

CONST n = 5;
     nsq = 25;

TYPE index = [1..n];
    soi = SET OF index;

VAR i,j: index;
   q: BOOLEAN;
   s: soi;
   a,b: ARRAY [1..8] OF INTEGER;
   h: ARRAY [1..n],[1..n] OF INTEGER;

PROCEDURE try(i: INTEGER; x,y: index; VAR q: BOOLEAN);
VAR k,u,v: INTEGER;
   q1: BOOLEAN;

BEGIN
 k := 0;
 REPEAT
   INC(k); q1 := FALSE;
   u := INTEGER(x) + a[k];
   v := INTEGER(y) + b[k];
   IF (index(u) IN s) AND (index(v) IN s) THEN
     IF h[u,v] = 0 THEN
       h[u,v] := i;
       IF i < nsq THEN
         try(i+1,u,v,q1);
         IF NOT q1 THEN h[u,v] := 0 END
       ELSE
         q1 := TRUE
       END
     END
   END
 UNTIL q1 OR (k = 8);
 q := q1
END try;

BEGIN
 a[1] :=  2; b[1] :=  1;
 a[2] :=  1; b[2] :=  2;
 a[3] := -1; b[3] :=  2;
 a[4] := -2; b[4] :=  1;
 a[5] := -2; b[5] := -1;
 a[6] := -1; b[6] := -2;
 a[7] :=  1; b[7] := -2;
 a[8] :=  2; b[8] := -1;
 s := soi{1..5};
 FOR i := 1 TO n DO
   FOR j := 1 TO n DO h[i,j] := 0 END
 END;
 h[1,1] := 1; try(2,1,1,q);
 IF q THEN
   FOR i := 1 TO n DO
     FOR j := 1 TO n DO WriteCard(h[i,j],5) END;
     WriteLn
   END
 ELSE
   WriteString('No Solution');
   WriteLn
 END
END knightstour.