A large commit.
[pdp8.git] / sw / src / pascal / KNIGHT.PS
diff --git a/sw/src/pascal/KNIGHT.PS b/sw/src/pascal/KNIGHT.PS
new file mode 100644 (file)
index 0000000..779f631
--- /dev/null
@@ -0,0 +1,46 @@
+PROGRAM KNIGHTSTOUR(OUTPUT);
+
+CONST N = 5; NSQ = 25;
+
+VAR   I,J: INTEGER;
+      Q: BOOLEAN;
+      A,B: ARRAY[1..8] OF INTEGER;
+      H: ARRAY[1..N,1..N] OF INTEGER;
+
+PROCEDURE TRY(I: INTEGER; X,Y: INTEGER; VAR Q: BOOLEAN);
+   VAR K,U,V: INTEGER; Q1: BOOLEAN;
+BEGIN K := 0;
+   REPEAT K:= K+1; Q1 := FALSE;
+      U := X + A[K]; V := Y + B[K];
+      IF (1<=U) AND (U<=N) AND (1<=V) AND (V<=N) THEN
+        IF H[U,V] = 0 THEN
+        BEGIN H[U,V] := I;
+           IF I < NSQ THEN
+              BEGIN TRY(I+1,U,V,Q1);
+                IF NOT Q1 THEN H[U,V] := 0
+              END ELSE Q1 := TRUE
+        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] :=  1; B[8] := -1;
+
+   FOR I := 1 TO N DO
+      FOR J := 1 TO N DO H[I,J] := 0;
+   H[1,1] := 1; TRY(2,1,1,Q);
+   IF Q THEN
+      FOR I := 1 TO N DO
+      BEGIN FOR J := 1 TO N DO WRITE( H[I,J] :5);
+         WRITELN
+      END
+   ELSE WRITELN("KEINE LOESUNG!")
+END.