Ферзи (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. |