You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.1 KiB
98 lines
2.1 KiB
-- 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 tqfind({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
|