50 lines
1.3 KiB
Ada
50 lines
1.3 KiB
Ada
with Ada.Text_IO; use Ada.Text_IO;
|
|
|
|
procedure Queens is
|
|
Board : array (1..8, 1..8) of Boolean := (others => (others => False));
|
|
function Test (Row, Column : Integer) return Boolean is
|
|
begin
|
|
for J in 1..Column - 1 loop
|
|
if ( Board (Row, J)
|
|
or else
|
|
(Row > J and then Board (Row - J, Column - J))
|
|
or else
|
|
(Row + J <= 8 and then Board (Row + J, Column - J))
|
|
) then
|
|
return False;
|
|
end if;
|
|
end loop;
|
|
return True;
|
|
end Test;
|
|
function Fill (Column : Integer) return Boolean is
|
|
begin
|
|
for Row in Board'Range (1) loop
|
|
if Test (Row, Column) then
|
|
Board (Row, Column) := True;
|
|
if Column = 8 or else Fill (Column + 1) then
|
|
return True;
|
|
end if;
|
|
Board (Row, Column) := False;
|
|
end if;
|
|
end loop;
|
|
return False;
|
|
end Fill;
|
|
begin
|
|
if not Fill (1) then
|
|
raise Program_Error;
|
|
end if;
|
|
for I in Board'Range (1) loop
|
|
Put (Integer'Image (9 - I));
|
|
for J in Board'Range (2) loop
|
|
if Board (I, J) then
|
|
Put ("|Q");
|
|
elsif (I + J) mod 2 = 1 then
|
|
Put ("|/");
|
|
else
|
|
Put ("| ");
|
|
end if;
|
|
end loop;
|
|
Put_Line ("|");
|
|
end loop;
|
|
Put_Line (" A B C D E F G H");
|
|
end Queens;
|