Условие: Рассмотрим шахматное поле n x n, на котором размещены n ферзей. Расположение ферзей называется допустимым, если они не атакуют друг друга. Написать программу построения всех полных допустимых расположений N ферзей, где 4<=N>=20.
Технические условия: В файле "input.txt" содержиться единственное число - n из интервала [4..20]. Программа должна выводить в файл "output.txt" для каждого допустимого расположения ферзей ряд из n натуральных чисел, где порядковый номер каждого числа указывает на номер вертикали, а значение - на номер горизонтали в шахматном поле.
Решение: 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.