Ферзи (3 уровень)

Условие:
Рассмотрим шахматное поле n x n, на котором размещены n ферзей. Расположение ферзей называется допустимым, если они не атакуют друг друга. Написать программу построения всех полных допустимых расположений N ферзей, где 4<=N>=20.

Технические условия:
В файле "input.txt" содержиться единственное число - n из интервала [4..20]. Программа должна выводить в файл "output.txt" для каждого допустимого расположения ферзей ряд из n натуральных чисел, где порядковый номер каждого числа указывает на номер вертикали, а значение - на номер горизонтали в шахматном поле.

Примеры файлов:

Input.txt

Output.txt

4

2 4 1 3
3 1 4 2

5

1 3 5 2 4
1 4 2 5 3
2 4 1 3 5
2 5 3 1 4
3 1 4 2 5
3 5 2 4 1
4 1 3 5 2
4 2 5 3 1
5 2 4 1 3
5 3 1 4 2

 

Решение:
type
    TNum=1..20;
    TField=array [TNum] of TNum;
var
    N:TNum;

    Field:TField;
    F:Text;

    First:Boolean;

Procedure Save;{Функция сохраняет координаты ферзей в файл}
var

   I:TNum;
begin
assign(f,'output.txt');
append(f);
if first then writeln(f) else first:=true;
for i:=1 to N-1 do Write(F,Field[i],' ');

Write(F,Field[n]);
close(f);
end;

Function Test(i:TNum):boolean;{Функция проверяет, является ли расположение ферзей допустимым}
var
   J:TNum;

   Flag:Boolean;
begin
j:=1;
flag:=true;
while (j<>i) and flag do
begin
  flag:=(Field[i]<>Field[j]) and (abs(Field[i]-Field[j])<>i-j);
  j:=j+1;
end;
test:=flag;
end;

Procedure Find(i:TNum);{Рекурсивная функция, задающая расположение фигур}
var

   J,K:TNum;
begin
for k:=1 to n do
begin
Field[i]:=k;
if test(i) then
if i=n then Save else Find(i+1);
end;
end;

Begin

{Читаем значение n из файла}
assign(F,'input.txt');
reset(F);
read(F,n);
close(f);

{Создаём файл для выходных данных}
assign(f,'output.txt');
rewrite(f);
close(f);

first:=false;{Файл пока пустой}
Find(1);{Запускаем рекурсивную функцию}
End.