Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Олимпиадные задачи с решениями на Turbo Pascal - Дмитрий


Информационный Канал Subscribe.Ru


Здравствуйте, уважаемые читатели.

   Теперь Вы можете просмотреть турнирную таблицу тут: www.olimpiadpas.narod.ru/turnir.html
В начале хочется поблагодарить всех тех, кто присылал мне свои мнения насчёт задачи "Кондукторы". Действительно, правильным решением оказалось решение Kr@b'а (для тех тестов). Теперь я не думаю, что стоит далее останавливаться на этой задаче. И ещё пара организационных предложений: убедительная просьба, вместе с решениями присылать и свой оригинальный ник, т. к. если Вы будете подписываться лишь именем, в турнирной таблице произойдёт некая неразбериха, т. к. людей с одинаковыми именами предостаточно. И ещё: в теме письма, в котором Вы высылаете решение, указывайте название задачи, если же письмо адресовано лично мне, укажите в теме "Рассылка". Решения прикрепляйте к Вашим письмам, а не пишите текст программы в теле письма. Файлы решений должны иметь расширение .pas и быть написанными на Turbo Pascal. На этом - всё. Переходим к нашим задачам..




   Предыдущая задача "Клад" оказалась слишком простой, так как все решения прошли все тесты. Поэтому всем, кто ни присылал "начислено" 20 баллов за эту задачу. Несмотря на простоту задачи, в Ваших решениях "проскакивали" вещь, на которые стоило бы обратить внимание: большинство из Вас использовало значение корня из 2 или корня из 0,5 как константу, округлённую до 4-х знаков после запятой. При больших входных данных происходило некоторое "отклонение" от правильного ответа (в сотых долях), что вызвано как раз таким округлением. Кроме того, что особенно печально, не все умеют правильно выводить ответ :) Например, если числа большие, то они просто навсего сливались. Тем не менее, публикую решение данной задачи человека, приславшего это самое решение первым - fman'а:

var i,a,b,n:longint; x,y,sq:real;
begin
 assign(input,'input.txt'); reset(input);
 readln(n); sq:=sqrt(2); x:=0; y:=0;
 for i:=1 to n do
  begin
    readln(a,b);
    case a of
    1 : y:=y+b;
    2 : begin x:=x+b/sq; y:=y+b/sq end;
    3 : x:=x+b;
    4 : begin x:=x+b/sq; y:=y-b/sq end;
    5 : y:=y-b;
    6 : begin x:=x-b/sq; y:=y-b/sq end;
    7 : x:=x-b;
    8 : begin x:=x-b/sq; y:=y+b/sq end;
    end;
  end;
 assign(output,'output.txt'); rewrite(output);
 writeln(x:0:3,' ',y:0:3); close(input); close (output);
end.                                                             

К сожалению, многие, решившие первую задачу, проигнорировали эту. А зря, ведь в турнирную таблицу добавляются баллы независимо от сложности задачи.


Теперь условие новой задачи:

"Фишки"

   Вы являетесь одним из разработчиков новой компьютерной игры. Игра происходит на прямоугольной доске, состоящей из W*H клеток. Каждая клетка может либо содержать, либо не содержать фишку.
Важной частью игры является проверка того, соединены ли две фишки путем, удовлетворяющим следующим свойствам:

    1. Путь должен состоять из отрезков вертикальных и горизонтальных прямых.
    2. Путь не должен пересекать других фишек.
При этом часть пути может оказаться вне доски.
Вам необходимо написать программу, проверяющую, можно ли соединить две фишки путем, обладающим вышеуказанными свойствами, и, в случае положительного ответа, определяющую минимальную длину такого пути (считается, что путь имеет изломы, начало и конец только в центрах клеток (или "мнимых клеток", расположенных вне доски), а отрезок, соединяющий центры двух соседних клеток, имеет длину 1).
Формат входных данных
Первая строка входного файла содержит два натуральных числа: W - ширина доски, H - высота доски (1<=W,H<=75). Следующие H строк содержат описание доски: каждая строка состоит ровно из W символов: символ "X" (заглавная английская буква "икс") обозначает фишку, символ "." (точка) обозначает пустое место. Все остальные строки содержат описания запросов: каждый запрос состоит из четырёх натуральных чисел, разделённых пробелами - X1, Y1, X2, Y2, причём 1<=X1,X2<=W, 1<=Y1,Y2<=H. Здесь (X1, Y1) и (X2, Y2) - координаты фишек, которые требуется соединить (левая верхняя клетка имеет координаты (1,1)). Гарантируется, что эти координаты не будут совпадать (кроме последнего запроса; см. далее). Последняя строка содержит запрос, состоящий из четырёх чисел 0; этот запрос обрабатывать не надо. Количество запросов не превосходит 20.
Формат выходных данных
Для каждого запроса необходимо вывести одно целое число на отдельной строке - длину кратчайшего пути, или 0, если такого пути не существует.

Например:
Файл INPUT.TXT
5 4
XXXXX
X . . . X
XXX . X
. XXX .
2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 0
Файл OUTPUT.TXT
5
6
0
Файл INPUT.TXT
4 4
XXXX
. X . .
. . X .
X . . .
1 1 3 1
0 0 0 0
Файл OUTPUT.TXT
4

На сегодня это всё. Следующий выпуск ожидается в воскресенье-понедельник. Не забудьте посетить страничку с турнирной таблицей. Жду Ваших решений. Удачи!!!

Дмитрий
tpascal@inbox.ru


Рассылки Subscribe.Ru
Turbo Pascal для школьников    
Ищешь фильм? Зайди на мой сайт http://aslof.balzer.ru/
Aslof aslof@mail.ru

Ищешь фильм? http://aslof.balzer.ru/
http://subscribe.ru/catalog/rest.cinema.filmforyou

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное