home *** CD-ROM | disk | FTP | other *** search
- (* 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.
-