RosettaCodeData/Task/N-queens-problem/ALGOL-68/n-queens-problem.alg

47 lines
952 B
Text
Raw Permalink Normal View History

2024-11-04 20:28:54 -08:00
# N-queens problem #
2023-07-01 11:58:00 -04:00
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:(
2024-11-04 20:28:54 -08:00
INT x = b[y];
BOOL safe := TRUE;
FOR i TO y - LWB b WHILE safe DO
INT t = b[y - i];
IF t = x THEN safe := FALSE
ELIF t = x - i THEN safe := FALSE
ELIF t = x + i THEN safe := FALSE
2023-07-01 11:58:00 -04:00
FI
OD;
2024-11-04 20:28:54 -08:00
NOT safe
2023-07-01 11:58:00 -04:00
);
INT s := 0;
PROC print board = VOID:(
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
);
2024-11-04 20:28:54 -08:00
# main # (
2023-07-01 11:58:00 -04:00
INT y := LWB b;
b[LWB b] := LWB b - 1;
2024-11-04 20:28:54 -08:00
WHILE y >= LWB b DO
WHILE IF (b[y]+:=1) <= UPB b THEN unsafe(y) ELSE FALSE FI DO SKIP OD;
IF b[y] <= UPB b THEN
2023-07-01 11:58:00 -04:00
IF y < UPB b THEN
b[y+:=1] := LWB b - 1
ELSE
print board
FI
ELSE
y-:=1
FI
OD
)