20 CONSTANT maxq
8 VALUE #q \ number of queens (20 max!)
: CARRAY CREATE CHARS ALLOT
DOES> SWAP CHARS + ;
maxq 2* CARRAY AA
maxq 2* CARRAY BB
maxq 2* CARRAY CC
maxq 2* CARRAY XX
0 VALUE #solutions
: AT 1+ SWAP
1- SWAP AT-XY ;
: CALC.SOLUTIONS #q 0
DO I 2DUP 2DUP - #q 1- + CC C@ ROT ROT + BB C@ AND SWAP AA C@ AND
IF I OVER XX C! I 2DUP + 0 SWAP BB C! 2DUP - #q 1- + 0 SWAP CC C!
0 SWAP AA C! DUP #q 1- <
IF DUP 1 + RECURSE
ELSE #solutions 1+ TO #solutions 0 0 AT-XY ." Solution: " #solutions .
#q 0 DO CR #q 0 DO ." . " LOOP LOOP
#q 0 DO I DUP XX C@ 3 * 1 + SWAP AT ." X " LOOP
THEN I 2DUP + 1 SWAP BB C! 2DUP - #q 1- + 1 SWAP CC C! 1 SWAP AA C!
THEN
LOOP DROP ;
: QUEENS 0 TO #solutions #q 0
DO 1 I AA C! 0 I XX C!
LOOP #q 2* 1- 0
DO 1 I BB C! 1 I CC C!
LOOP PAGE 0 CALC.SOLUTIONS #q #q AT ;
: HELP CR ." Enter QUEENS to solve the " #q 0 .R ." -queens problem" ;
HELP