-- Test file for Kate's Euphoria syntax highlighting/code folding. -- BEGIN region marker test -- code here -- END region marker test -- The N Queens Problem: -- Place N Queens on an NxN chess board -- such that they don't threaten each other. constant N = 8 -- try some other sizes constant ROW = 1, COLUMN = 2 constant TRUE = 1, FALSE = 0 type square(sequence x) -- a square on the board return length(x) = 2 end type type row(integer x) -- a row on the board return x >= 1 and x <= N end type function threat(square q1, square q2) -- do two queens threaten each other? if q1[COLUMN] = q2[COLUMN] then return TRUE elsif q1[ROW] - q1[COLUMN] = q2[ROW] - q2[COLUMN] then return TRUE elsif q1[ROW] + q1[COLUMN] = q2[ROW] + q2[COLUMN] then return TRUE elsif q1[ROW] = q2[ROW] then return TRUE else return FALSE end if end function function conflict(square q, sequence queens) -- Would square p cause a conflict with other queens on board so far? for i = 1 to length(queens) do if threat(q, queens[i]) then return TRUE end if end for return FALSE end function integer soln soln = 0 -- solution number procedure print_board(sequence queens) -- print a solution, showing the Queens on the board integer k position(1, 1) printf(1, "Solution #%d\n\n ", soln) for c = 'a' to 'a' + N - 1 do printf(1, "%2s", c) end for puts(1, "\n") for r = 1 to N do printf(1, "%2d ", r) for c = 1 to N do if find({r,c}, queens) then puts(1, "Q ") else puts(1, ". ") end if end for puts(1, "\n") end for puts(1, "\nPress Enter. (q to quit) ") while TRUE do k = get_key() if k = 'q' then abort(0) elsif k != -1 then exit end if end while end procedure procedure place_queen(sequence queens) -- place queens on a NxN chess board -- (recursive procedure) row r -- only need to consider one row for each queen if length(queens) = N then soln += 1 print_board(queens) return end if r = length(queens)+1 for c = 1 to N do if not conflict({r,c}, queens) then place_queen(append(queens, {r,c})) end if end for end procedure