Pristine Ack-5.5
[Ack-5.5.git] / lang / m2 / test / queens.mod
1 MODULE queen;
2 FROM InOut IMPORT WriteString, WriteLn;
3         TYPE row = ARRAY[1..8] OF INTEGER;
4         VAR  maxpos: INTEGER;
5              d: row;
6         PROCEDURE free(i,j: INTEGER): BOOLEAN;
7                 VAR k: INTEGER;
8         BEGIN
9                 FOR k := 1 TO i-1 DO
10                         IF (d[k]=j) OR (j-d[k]=i-k) OR (d[k]-j=i-k) THEN
11                                 RETURN FALSE;
12                         END;
13                 END;
14                 RETURN TRUE;
15         END free;
16
17         PROCEDURE print;
18                 VAR i,j: INTEGER;
19         BEGIN
20                 FOR j := maxpos TO 1 BY -1 DO
21                         FOR i := 1 TO maxpos DO
22                                 IF d[i] = j THEN
23                                         WriteString("D ");
24                                 ELSE
25                                         WriteString(". ");
26                                 END;
27                         END;
28                         WriteLn;
29                 END;
30                 WriteLn;
31         END print;
32
33         PROCEDURE queen(k: INTEGER);
34                 VAR i: INTEGER;
35         BEGIN
36                 IF k = maxpos THEN
37                         FOR i := 1 TO maxpos DO
38                                 IF free(k,i) THEN
39                                         d[k] := i;
40                                         print();
41                                 END;
42                         END;
43                 ELSE
44                         FOR i := 1 TO maxpos DO
45                                 IF free(k,i) THEN
46                                         d[k] := i;
47                                         queen(k+1);
48                                 END;
49                         END;
50                 END;
51         END queen;
52 BEGIN
53         maxpos := 8;
54         queen(1);
55 END queen.