Примеры задач для олимпиады (1999 год)

advertisement
ЗАДАЧА 1. Путь в лабиринте
Поиск пути в лабиринте - одна из популярных компьютерных задач. В
нашем случае лабиринт будет представлять прямоугольный массив ячеек,
каждая из которых может иметь стены с запада (слева), с востока
(справа), с севера (сверху) и с юга (снизу). В лабиринте выделена
одна ячейка, являющаяся началом пути, и другая ячейка, являющаяся
целью, в которой путь должен завершиться. Ваше задание состоит в том,
чтобы найти единственный путь из начала в цель, занумеровать ячейки
на этом пути, а также указать те ячейки, которые посещались при
поиске пути, но не вошли в него, а затем распечатать лабиринт с
решением.
Ниже приведен алгоритм, который Вы должны реализовать при поиске
пути. Представьте, что в начальной ячейке находится робот. Он
последовательно пытается двигаться из ячейки на запад, затем на
север, затем на восток, затем на юг. Робот может передвинуться в
выбранном направлении, если (а) нет стены, мешающей этому сдвигу и
(b) он еще не посещал ячейку, в которую должен попасть при этом
движении. Если робот попадает в ячейку, из которой никуда не может
сдвинуться в соответствии с этими правилами, то он возвращается в
предыдущую ячейку и пытается сдвинуться в следующем еще не
испробованном направлении.
Рассмотрим простой лабиринт, состоящий из 2-х строк и 3-х столбцов,
показанный ниже. Начальная ячейка помечена символом S, а целевая символом G. Стартовав, робот попытается сдвинуться на запад (влево),
но наткнется на стену, затем попытается пойти на север (вверх), но
снова обнаружит стену, еще одна стена не пустит его на восток
(вправо). Затем он попробует сдвинуться на юг и успешно
переместится на ячейку вниз. Из этой новой ячейки он сдвинется на
восток. Хотя ячейка в середине нижней строки, в которой он теперь
оказался, не ограничена с запада стеной, сдвинуться на запад нельзя,
поскольку он окажется в уже пройденной ячейке. Поэтому следующим
направлением, в котором робот успешно сдвинется, будет север. К
сожалению, после этого невозможен никакой "легальный" сдвиг, поэтому
он возвратится в предыдущую ячейку внизу и пойдет из нее на восток.
Затем из правой нижней ячейки робот сдвинется на север и попадет в
целевую ячейку. Лабиринт, который должен быть выведен в качестве
решения задачи, показан справа. Начальная ячейка в нем отмечена ’1’ ,
остальные ячейки пути, включая и целевую, занумерованы
последовательно, а посещенная ячейка, не вошедшая в путь, отмечена
вопросительными знаками.
+---+---+---+
| S |
| G |
+
+
+
+
|
|
+---+---+---+
+---+---+---+
| 1|???| 5|
+
+
+
+
| 2
3
4|
+---+---+---+
Вход
Лабиринт представляется как массив ячеек, самая северная (верхняя)
строка которого имеет номер 1, и самый восточный (левый) столбец
также имеет номер 1. Таким образом, начальная ячейка в нашем примере
имеет координаты 1, 1, а целевая ячейка - координаты 1,3. Входной
файл INPUT.TXT содержит один или несколько лабиринтов. Каждый
лабиринт начинается строкой из шести чисел. Первые два задают его
высоту (число строк) и ширину ( число столбцов). Следующие два числа
задают позицию начальной ячейки, а последние два - позицию целевой
ячейки. Высота и ширина любого лабиринта не превышают 12. Вслед за
1
строкой с шестью числами следуют строки файла, представляющие строки
лабиринта. Каждая ячейка строки задается одним числом, кодирующим ее
стены следующим образом: 1 - есть восточная стена, 2 - есть южная
стена, 3 - есть и восточная и южная стены 0 - нет ни восточной, ни
южной стены. Кроме того, предполагается, что все ячейки в крайних
строках и столбцах имеют стены, предотвращающие выход робота за
пределы лабиринта. Эти стены не указываются явно в представлении
лабиринта (например, 0 для самой нижней ячейки справа означает, что
у нее есть и восточная и южная стены !). Последняя строка во входном
файле состоит из шести нулей.
Выход
Для каждого лабиринта выходной файл OUTPUT.TXT должен содержать номер
лабиринта, за которым следует представление лабиринта с решением, как
это показано в приведенном выше примере и в примерах ниже.
Пример.
2
1
0
4
0
0
0
0
0
3
1
0
3
3
2
3
1
0
Input.txt:
1 1 1 3
0
0
3 2 4 3
0
0
0
0
0 0 0 0
Ожидаемый результат. Output.txt:
Лабиринт 1
+---+---+---+
| 1|???| 5|
+
+
+
+
| 2
3
4|
+---+---+---+
Лабиринт 2
+---+---+---+
|??? ???|???|
+
+---+
+
| 3
4
5|
+
+---+
+
| 2
1| 6|
+
+---+
+
|
| 7|
+---+---+---+
2
ЗАДАЧА 2. ПУТЕШЕСТВИЕ БЕЗ ОСТАНОВОК
Фил работает в вечерней смене и покидает автостоянку своей компании
ровно в 2 часа ночи. Его путь домой пролегает по прямой дороге, на
которой расположен один или несколько светофоров. Филу всегда
хотелось бы знать, может ли он при заданном расположении светофоров
и циклах смены цветов у них так выбрать скорость, чтобы доехать до
дома, ни разу не изменив ее из-за красного света светофора. Вам
предстоит написать программу, удовлетворяющую любопытство Фила.
Ваша программа должна найти все целочисленные значения скоростей (в
км/час), которые может использовать Фил для безостановочной поездки
домой. Будем считать, что с каждой такой скоростью он выезжает с
автостоянки в 2:00 и сохраняет ее, пока не доедет до дома. При этом
Фил никогда не проезжает на красный свет (при этом ему разрешается
проезжать светофор точно в момент смены света с желтого на красный и
с красного на зеленый). Поскольку Фил старается соблюдать
установленные в городе ограничения, то его скорость не должна
превышать 60 км/час. Но он также не любит слишком медленной езды,
поэтому Вы не должны рассматривать скорости меньше 30 км/час.
ВХОД
Входной файл INPUT.TXT состоит из одного или нескольких наборов
данных, описывающих светофоры на пути домой. Файл завершается
строкой с числом -1. Первое число в каждом наборе задает число
N светофоров (оно не превосходит 6). За ним следуют N строк, с
четырьмя числами L, G, Y и R на каждой, характеризующими отдельный
светофор. L - положительное вещественное число, задающее расстояние
в км от автостоянки до данного светофора. Числа G, Y и R задают
промежутки времени ( в секундах), через которые на данном светофоре
сменяются циклически зеленый, желтый и красный свет. Известно, что на
всех N светофорах начало включения зеленого света приходится ровно на
2:00.
ВЫХОД
Выходной файл OUTPUT.TXT должен содержать для каждого набора входных
данных его номер (нумерация начинается с 1), за которым следует
список всех допустимых целочисленных значений скоростей, с которыми
может ехать Фил, чтобы избежать встречи с красным светом. Подряд
идущие скорости нужно представлять как интервалы вида L-H, где L и H
являются наименьшей и наибольшей скоростью в интервале. Интервалы
вида L-L (т.е. интервалы длины 1) нужно записывать просто как L.
Интервалы должны быть отделены друг от друга запятыми. Если не
окажется ни одной допустимой скорости, то Ваша программа должна
поместить в файл фразу: "Нет допустимой скорости." Формат выхода
показан в следующем примере.
ПРИМЕР.
INPUT.TXT:
1
5.5 40 8 25
3
10.7 10 2 75
12.5 12 5 57
17.93 15 4 67
-1
Ожидаемый выход OUTPUT.TXT:
1: 30, 32-33, 36-38, 41-45, 48-54, 59-60
2: Нет допустимой скорости.
3
Judge’s Input Data and Expected Output
Sample Solution
-----------------------------------------------------------------------This page maintained by Ed Karrels.
Last updated November 14, 1997
4
ЗАДАЧА 3. РАСПОЗНАВАНИЕ ДЕРЕВА
Деревья представляют очень интересный и важный класс графов. С
их помощью представляются иерархические структуры, являющиеся основой
всех классификаций, отношения подчиненности в коллективах, отношения
наследования в объектно-ориентированных языках программирования и др.
Ориентированный граф G= (V, E) задается множеством вершин V,
и множеством дуг E. Каждая дуга e из E - определяется парой v, w
вершин из V. Говорят, что дуга e выходит из v и входит в w. Деревом
называется такой граф G = (V, E), для которого выполнены два условия:
1) имеется ровно одна вершина r из V, в которую не входит ни одна
дуга (такая вершина называется корнем дерева), а в каждую из
остальных вершин входит ровно одна дуга;
2) для каждой отличной от корня вершины w в G существует путь из
корня в эту вершину, т.е. такая последовательность вершин
v1,...vi,v(i+1),...,vn, что v1= r, vn = w и для любого i < n в E
есть дуга которая выходит из vi и входит в v(i+1).
Ваша задача состоит в том, чтобы написать программу, проверяющую
является ли граф деревом.
ВХОД
Входной файл INPUT.TXT содержит описание одного или нескольких графов
и заканчивается строкой, содержащей -1. Описание каждого графа
состоит из одной или нескольких строк с парами целых чисел, задающих
дуги графа. Оно заканчивается парой 0 0. Вершины графа именуются
положительными целыми числами, а каждая дуга e из E представляется
парой таких чисел A B, означающей, что она выходит из вершины A и
входит в вершину B. На каждой строке может располагаться одна или
несколько пар чисел. Предполагается, что в графе нет вершин, в
которые не входят или из которых не выходят дуги. Поэтому множество
вершин графа V однозначно определяется по множеству его дуг E.
Число вершин в графах, представленных во входе, не превышает 20.
ВЫХОД
Результатом работы Вашей программы должен быть выходной файл
OUTPUT.TXT, в который для каждого графа, представленного во входном
файле, должна быть помещена одна из строк:
"Граф i - дерево."
или
"Граф i - не дерево."
в зависимости от того является ли i-ый по счету граф во входном файле
деревом или нет.
ПРИМЕР.
Вход INPUT.TXT:
7 2 2 5
7 4 0 0
1 2
2 1
0 0
-1
Ожидаемый выход OUTPUT.TXT:
Граф 1 - дерево.
Граф 2 - не дерево.
5
ЗАДАЧА 4. ЗАПОЛНЕНИЕ ОКНАМИ
Экраны мониторов и окна, расположенные на них имеют форму прямоугольника.
Пропорцией экрана или окна назовем его ширину, деленную на высоту.
Мы будем предполагать, что все размеры измеряются в целых числах (пикселах).
Предположим, что наша программа позволяют изменять размеры окон только так,
чтобы при этом сохранялись их пропорции. Например, окно шириной в 150
пикселов и высотой в 100 пикселов (и с пропорцией 1.5) можно превратить
в окно шириной 225 и высотой 150 пикселов, но нельзя превратить его в
окно шириной 220 и высотой 150 пикселов. Каждое окно можно переместить в
любое место экрана при условии, что оно полностью видимо на экране.
Вопрос, на который должна отвечать Ваша программа следующий:
по заданному размеру экрана и размерам четырех окон определить, можно
ли так изменить размеры этих окон(сохраняя пропорции) и расположить их
на экране (без перекрытия), что они полностью покроют экран.
Например, рассмотрим квадратный экран с четырьмя квадратными окнами.
Пропорция каждого из них равна 1. Ясно, что в этом случае можно так
изменить размеры квадратных окон, чтобы они полностью покрыли экран.
Этот случай проиллюстрирован в первом задании приведенного ниже примера.
Вход
Входной файл INPUT.TXT состоит из одного или нескольких заданий и
заканчивается парой нулей. Каждое задание находится на отдельной
строке и состоит из пяти пар целых чисел. Первая пара задает ширину
и высоту экрана, а каждая из следующих четырех пар определяет
начальные размеры одного из окон.
Выход
Выходной файл OUTPUT.TXT должен для каждого задания содержать одну строку,
содержащую номер задания (нумерация начинается с 1), за которым следует слово
Yes, если экран можно полностью покрыть окнами (изменив, если потребуется,
их размеры и местоположение) без их пересечения.
Пример.
Вход Input.txt:
400 400
200 300
200 250
0 0
10 10
10 10
10 10
35 35
20 20
20 20
15 15
30 45
30 45
100 100
40 60
40 60
Ожидаемый результат OUTPUT.TXT:
1: Yes
2: No
3: Yes
6
Задача 5.
Списки газет
Статистическому бюро нужна программа, которая выдавала бы инструкции
для некоторой существующей системы, создающей анкеты о газетах.
Инструкции, которые требуются этой системе, представляют из себя
списки названий газет, разделенных запятыми, каждый список содержит
некоторое подмножество из множества всех газет, издаваемых в
определенной области. Ваша программа будет считывать список всех
газет и выдавать по нему в определенном порядке списки подмножеств
заданного размера.
ВХОД
Входной файл INPUT.TXT состоит из первой строки, задающей размеры
подмножеств газет, которые должны быть перечислены, за которой идут
строки с названиями газет (по одному названию на строке). Название
каждой газеты состоит из не более 30 символов, а всего в файле может
быть перечислено не более 12 газет. Первая строка будет содержать
либо одно положительное целое число, либо два положительных целых
числа (первое всегда меньше второго). Числа в этой строке не
превосходят числа следующих далее газет. Число N в первой строке
означает, что нужно перечислить все подмножества из N газет. Пара
чисел M N означает, что нужно перечислить все подмножества размерами
от M до N.
ВЫХОД
Выходной файл OUTPUT.TXT должен состоять из разделенных запятыми
списков подмножеств газет, по одному списку в строке, сгруппированных
по размеру подмножеств. При этом группе списков определенного размера
должна предшествовать строка, на которой этот размер указан. Группы
списков должны быть упорядочены по возрастанию размера подмножеств.
Порядок строк с подмножествами в одной группе и порядок названий
газет в одной строке должны отражать порядок перечисления газет во
входном файле.
ПРИМЕР. INPUT.TXT:
2 3
Times
Herald-Tribune
Post
New Advocate
Ожидаемый результат OUTPUT.TXT:
Размер 2
Times, Herald-Tribune
Times, Post
Times, New Advocate
Herald-Tribune, Post
Herald-Tribune, New Advocate
Post, New Advocate
Размер 3
Times, Herald-Tribune, Post
Times, Herald-Tribune, New Advocate
Herald-Tribune, Post, New Advocate
7
Задача 6
Многочлен с вещественными коэффициентами можно представить в виде списка
l, звенья которого имеют поля n, a[n], где n - степень x, a[n] - коэффициент при x в
степени n. Если a[n]=0, то соответствующее звено в список не включается.
Ваша программа по входному файлу INPUT.TXT, содержащему две строки с записями
многочленов p(x) и q(x) в естественном формате, например, 5x^20+4x^5-x+3,
должна поместить в выходной файл OUTPUT.TXT две строки,
задающие звенья списков для p(x) и q(x), и третью строку со словом "Да",
если p(x)=q(x), и со словом "Нет", в противном случае.
Каждое звено представляется парой чисел n a[n].
Звенья отделяются друг от друга парой символов ">".
ПРИМЕР. INPUT.TXT:
2x^5+3x^3-6x^2-1
2x^5+3x^3-6x^2-1
Ожидаемый выход OUTPUT.TXT:
5 2 >> 3 3 >> 2 -6 >>0 -1
5 2 >> 3 3 >> 2 -6 >>0 -1
Да
8
Задача 7
Многочлен с вещественными коэффициентами можно представить в виде списка
l, звенья которого имеют поля n, a[n], где n - степень x, a[n] - коэффициент при x в
степени n. Если a[n]=0, то соответствующее звено в список не включается.
Ваша программа по входному файлу INPUT.TXT, содержащему две строки: одну с записью
многочлена p(x) в естественном формате, например, 5x^20+4x^5-x+3, и вторую строку с
вещественным числом N должна поместить в выходной файл OUTPUT.TXT две строки: первую со
списком звеньев для p(x)и вторую со значением p(N).Каждое звено представляется парой
чисел n a[n]. Звенья отделяются друг от друга парой символов ">".
ПРИМЕР. INPUT.TXT:
2x^5+3x^3-6x^2-1
1.0
Ожидаемый выход OUTPUT.TXT:
5 2 >> 3 3 >> 2 -6 >>0 -1
-2.0
9
Download