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

Олимпиадные задачи и алгоритмы на C++


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

Олимпиадные задачи и алгоритмы на C++

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


Задача №7 "Манхеттен" (5 баллов).

Входной файл: input.txt
Выходной файл: output.txt
Ограничение по времени: 1 сек. на тест
Ограничение по памяти: 1 Mb

Условие

     На плоскости задано n точек. Расстояние между точками (x1, y1) и (x2, y2) будет вычислять как сумму модулей разностей их координат: r = |x1 - x2| + |y1 - y2|. Найти точку, сумма расстояний от которой до заданных n точек минимальна.

Формат входного файла

     В первой строке задано одно целое число n, 1 <= n <= 1000. Далее идут n строк, в каждой из которых записаны два числа, разделенные пробелом, - координаты точек. Координаты - целые числа, по модулю меньше 10000.

Формат выходного файла

     Вывести одну строку, содержащую два вещественных числа, разделенные пробелом. Числа выводить с 5 знаками после десятичной точки. Если существует несколько точек с минимальной суммой расстояний, то выведите любую из них.

Пример входного файла (input.txt)


4
-1 1
2 0
4 4
2 5

Пример выходного файла (output.txt)


2.00000 3.14159

Задача №8 "Морской бой" (10 баллов).

Входной файл: input.txt
Выходной файл: output.txt
Ограничение по времени: 1 сек. на тест
Ограничение по памяти: 1 Mb

Условие

     В игру "Морской бой" играют два человека. В начале игры каждый чертит на клеточном листе бумаги свое поле - квадрат с длиной стороны 10 клеток. Строки квадрата обозначаются латинскими буквами от a до j сверху вниз, столбцы - цифрами от 0 до 9 слева направо. Затем игрок расставляет на своем поле корабли: один 4-палубный, два 3-палубных, три 2-палубных и четыре 1-палубных. Корабль - это группа соседних клеток, образующих горизонтальную или вертикальную полоску. Количество палуб корабля - это количество клеток, из которых он состоит. Корабли могут соприкасаться со сторонами поля, но не могут касаться друг друга. Игроки не показывают друг другу свои поля. Примеры полей с расставленными кораблями ('.' - пусто, '#' - палуба):


     №1               №2               №3               №4

  0123456789       0123456789       0123456789       0123456789
a .......###     a ....##....     a .#.....###     a ..........
b ..####....     b ..........     b #.........     b ..........
c #.........     c .##...#...     c ..#.###...     c .####.....
d #.#..##...     d ......#...     d ..........     d ..........
e #.#.......     e .#.#......     e ####......     e ##....##..
f ..........     f ...#...#..     f ..........     f ....#.....
g ......#...     g ...#......     g .#....#...     g .#..#.....
h ##.......#     h #..#...#.#     h .#....#...     h .#..#..#..
i ....#.....     i #.........     i ..........     i ..........
j .......#..     j #......###     j .#....##..     j ..#.#.#...

     В примерах №1 и №2 корабли расставлены правильно. В примере №3 корабли расставлены неверно, потому что два однопалубных корабля (a1 и b0) касаются друг друга. В примере №4 не хватает одного 3-палубного корабля.

     Первый игрок делает первый ход. Ход заключается в том, что игрок называет позицию на поле противника. Это клетка, в которую стреляет игрок. Причем по правилам он не может выстрелить в одну и ту же клетку дважды. Если эта клетка пуста, то противник говорит "мимо" и ход переходит к нему. В противном случае палуба корабля, расположенная в данной клетке, считается уничтоженной, и возможны два варианта. 1) Если все остальные палубы данного корабля были уничтожены раньше (или это 1-палубный корабль), то противник говорит "убит". 2) Если у корабля сохранилась хотя бы одна палуба, то противник говорит "ранен". В обоих случаях ход снова делает тот же игрок (т.е. он стреляет, пока не промахнется). Задача каждого игрока - уничтожить все корабли противника. Выигрывает тот, кто сделает это раньше.

     Вам нужно написать программу, которая получает расстановку кораблей и список ходов игроков и проверяет, по правилам ли проходила игра. Если игроки допустили ошибки, то программа должна выдать сообщение о первой обнаруженной ошибке. Если ошибок нет, то программа должна установить, завершилась игра или нет, и, если завершилась, то выявить победителя.

Формат входного файла

     Первые десять строк входного файла содержат по десять символов каждая. В них задано описание поля первого игрока. В строках содержатся символы '.' (пустая клетка) и '#' (палуба корабля). Затем идет пустая строка. В следующих десяти строках аналогично задается поле второго игрока. Затем идет пустая строка. Следующая (23-я по счету) строка содержит одно целое число n, 0 <= n <= 1000 - количество сделанных ходов. Следующие n строк задают описание ходов в том порядке, в котором их делали игроки. Описание хода имеет формат "номер_игрока позиция ответ_противника". "номер_игрока" - один из символов '1' или '2'. "позиция" - два символа, первый - буква от 'a' до 'j', второй - цифра от '0' до '9'. "ответ_противника" - слово 'past' (мимо), 'killed' (убит) или 'wounded' (ранен).

Формат выходного файла

     В выходной файл вы должны выдать одно из следующих сообщений.

  1. "Error: first player's field is incorrect"

  2. Первый игрок неверно расставил свои корабли.
  3. "Error: second player's field is incorrect"

  4. Второй игрок неверно расставил свои корабли.
  5. "Error in move #k: the game is already finished"

  6. (Здесь и далее k нужно заменить на номер хода (нумерация с 1).) Игра уже завершена, но игрок делает ход. Напомню, что игра завершается, когда у одного из игроков уничтожены все корабли.
  7. "Error in move #k: this move must be made by another player"

  8. Ходить должен другой игрок.
  9. "Error in move #k: two shots in one place"

  10. Игрок выстрелил в клетку, в которую уже стрелял.
  11. "Error in move #k: wrong enemy's answer"

  12. Противник дал неправильный ответ.
  13. "OK: first player is winner"

  14. Первый игрок победил.
  15. "OK: second player is winner"

  16. Второй игрок победил.
  17. "OK: the game isn't finished yet"

  18. Игра еще не завершена.

     Если ход содержит сразу несколько ошибок, то выдайте сообщение с меньшим номером.

Пример входного файла (input.txt)


 .......###
 ..####....
#.........
#.#..##...
#.#.......
 ..........
 ......#...
##.......#
 ....#.....
 .......#..

 ....##....
 ..........
 .##...#...
 ......#...
 .#.#......
 ...#...#..
 ...#......
#..#...#.#
#.........
#......###

8
1 a4 wounded
1 a3 past
2 j9 past
1 b4 past
2 b1 past
1 a5 killed
1 h1 past
2 b2 wounded

Пример выходного файла (output.txt)


OK: the game isn't finished yet

Пример входного файла (input.txt)


 .......###
 ..####....
#.........
#.#..##...
#.#.......
 ..........
 ......#...
##.......#
 ....#.....
 .......#..

 ....##....
 ..........
 .##...#...
 ......#...
 .#.#......
 ...#...#..
 ...#......
#..#...#.#
#.........
#......###

8
2 a0 killed
1 a3 past
2 j9 past
1 b4 past
2 b1 past
1 a5 killed
1 h1 past
2 b2 wounded

Пример выходного файла (output.txt)


Error in move #1: this move must be made by another player

Пример входного файла (input.txt)


#........#
 .########.
 ..#....#..
####..####
 .#..##..#.
##..##..##
 .#.#..#.#.
###....###
 .########.
#........#

 ..........
 ..#####...
 .#....##..
 .#...#.#..
 .#..#..#..
 .#..#..#..
 .#.#...#..
 .##....#..
 ..#####...
 ..........

8
2 a0 killed
1 a3 past
2 j9 past
1 b4 past
2 b1 past
1 a5 killed
1 h1 past
2 b2 wounded

Пример выходного файла (output.txt)


Error: first player's field is incorrect

Оформление, отправка и проверка решений.

    На проверку принимаются решения, написанные на языке C++. Отправляйте свои письма по адресу accepted@narod.ru. Решение должно содержаться в одном файле, вложенном в ваше письмо. Для компиляции, по вашему выбору, будет использоваться программа bcc.exe (Borland C++ 3.1) или cl.exe (Microsoft Visual C++ 6.0). Размер исходного кода не должен превышать 40 Kb. Для каждой задачи отправляйте отдельное письмо. В теле письма укажите следующие данные (пример):

ник (*): vasya
пароль (*): a193z458w2
фамилия: Иванов
имя: Василий
e-mail: vasya@hotmail.com
номер задачи (*): 1
компилятор (*): cl

    (*) обозначены обязательные для заполнения поля. Ник и пароль вы сами придумаете при отправке своего первого письма. В последующих письмах указывайте те же самые ник и пароль. Я пока не придумал, что делать, если два человека используют один и тот же ник. Так что, старайтесь придумать его так, чтобы никто до вас его еще не придумал :-) Если вы укажите свой e-mail, то с этой проблемой будет легче разобраться. В качестве компилятора укажите bcc или cl. И, главное, не забудьте указать номер задачи!

    При проверке решений, используются стандартные правила acm. Их можно найти, например, на сайте http://acm.baylor.edu. Проверка решений осуществляется на наборе тестов, недоступных участникам. Решение считается принятым, если выдало верный ответ на каждом из тестов. Программа должна считывать данные из указанного в условии входного файла и выдавать результат в указанный в условии выходной файл. Она не должна работать с другими файлами или каталогами. Входной файл нельзя открывать для записи. При доступе к входному и выходному файлу вы должны предполагать, что они находятся в текущей директории. Не используйте консольный ввод или вывод.


    Решения принимаются до субботы следующей недели (15 мая 2004) включительно. В воскресенье (16 мая 2004) будут высланы результаты тестирования и авторские решения.

Ведущий рассылкой: Виктор Журавлев
Вопросы, пожелания, предложения пишите на мой e-mail.



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


В избранное