52 lines
962 B
Plaintext
52 lines
962 B
Plaintext
INT ofs = 1, # Algol68 normally uses array offset of 1 #
|
|
dim = 8; # dim X dim chess board #
|
|
[ofs:dim+ofs-1]INT b;
|
|
|
|
PROC unsafe = (INT y)BOOL:(
|
|
INT i, t, x;
|
|
x := b[y];
|
|
FOR i TO y - LWB b DO
|
|
t := b[y - i];
|
|
IF t = x THEN break true
|
|
ELIF t = x - i THEN break true
|
|
ELIF t = x + i THEN break true
|
|
FI
|
|
OD;
|
|
FALSE EXIT
|
|
break true:
|
|
TRUE
|
|
);
|
|
|
|
INT s := 0;
|
|
|
|
PROC print board = VOID:(
|
|
INT x, y;
|
|
print((new line, "Solution # ", s+:=1, new line));
|
|
FOR y FROM LWB b TO UPB b DO
|
|
FOR x FROM LWB b TO UPB b DO
|
|
print("|"+(b[y]=x|"Q"|: ODD(x+y)|"/"|" "))
|
|
OD;
|
|
print(("|", new line))
|
|
OD
|
|
);
|
|
|
|
main: (
|
|
INT y := LWB b;
|
|
b[LWB b] := LWB b - 1;
|
|
FOR i WHILE y >= LWB b DO
|
|
WHILE
|
|
b[y]+:=1;
|
|
# BREAK # IF b[y] <= UPB b THEN unsafe(y) ELSE FALSE FI
|
|
DO SKIP OD;
|
|
IF b[y] <= UPB b THEN
|
|
IF y < UPB b THEN
|
|
b[y+:=1] := LWB b - 1
|
|
ELSE
|
|
print board
|
|
FI
|
|
ELSE
|
|
y-:=1
|
|
FI
|
|
OD
|
|
)
|