Меню сайта

Категории раздела
Готовимся к олимпиаде по программированию (задачи взяты с сайта http://olimpiada.com.ru) [36]
Решение олимпиадных задач по программированию
Готовимся к олимпиаде по математике [3]
Решение олимпиадных задач по математике

Мини-чат

Наш опрос
Оцените мой сайт
Всего ответов: 2678

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Главная

Регистрация

Вход
Вы вошли как Гость | Группа "Гости" | RSS


Личный сайт учителя математики и информатики

Фоновой Натальи Леонидовны



Пятница, 26.04.2024, 16:22
Главная » Файлы » Внеурочная деятельность » Готовимся к олимпиаде по программированию (задачи взяты с сайта http://olimpiada.com.ru)

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

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

Примеры входных и выходных файлов:
Input.txt
4
Output.txt
2 4 1 3
3 1 4 2

Input.txt
5
Output.txt
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.
Категория: Готовимся к олимпиаде по программированию (задачи взяты с сайта http://olimpiada.com.ru) | Добавил: admin
Просмотров: 798 | Загрузок: 0 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Поиск

Кнопка сайта

Одна кнопка

время жизни сайта

Сайт участвует
конкурс сайтов 

Новости образовани

Фраза дня

Web-мастеру

OperaFirefoxGoogle ChromeDownload Master
QIPSkypeµTorrentTeamViewer
Dr.Web CureITAvira AntiVirTotal CommanderCDBurnerXP
PicasaIrfanViewCheMaxDAEMON Tools
AIMPKMPlayerBSplayerK-Lite Codec Pack

Установить себе такой Блок
Скрипты и HTML для uCOz

Раскрутка сайта
Graffiti Decorations(R) Studio (TM) Site Promoter

Copyright MyCorp © 2024
/td>