Санкт-Петербургские Олимпиады по Информатике

Задачи международной олимпиады 1991 года

Первый тур: Таблица
Второй тур: S-термы

Задача "Таблица"

Пронумеровать позиции в матрице (таблице) размером 5x5 следующим образом. Если номер i (1<=i<25) соответствует в матрице позиции с координатами (x,y), то номер i+1 может соответствовать позиции с координатами (z,w), вычисляемыми по одному из следующих правил:

  1. (z,w) = (x+-3,y);
  2. (z,w) = (x,y+-3); Внимание: плюс/минус
  3. (z,w) = (x+-2,y+-2).

Требуется:

A. Написать программу, которая последовательно нумерует позиции матрицы 5x5 при заданных координатах позиции, в которой проставлен номер 1 (результаты должны быть выведены в виде заполненной матрицы);

Б. Вычислить число всех возможных расстановок номеров для всех начальных позиций, расположенных в правом верхнем треугольнике матрицы, включая ее главную диагональ.

Пример. Если в качестве начальной позиции в матрице выбрана позиция с координатами (2,2), то на данном шаге координаты позиции с номером 2 в соответствии с представленными правилами могут быть (2,5), (5,2) или (4,4).

Задача "S-термы"

S-терм - это последовательность символов S и скобок, определяемая рекурсивно следующим образом:

Пример S-терма: ((((SS)(SS))S)(SS)). Правые скобки не несут информации и могут опускаться. В этом случае вышеприведенный S-терм выглядит так: ((((SS)(SS))S)(SS.

Задание 1. Напишите процедуру "gensterm" для порождения S-термов. Она должна для заданного n заполнять n текстовых файлов (n = длина = число символов 'S'), каждый из которых содержит все S-термы длины n = 1,2,...,n соответственно. Внутри файла S-термы разделяются символом ';'. В конце каждого файла должен стоять символ '.' (точка).

Напишите программу, которая по заданному целому n (n <= 10) выполняет описанную выше процедуру и выдает на дисплей все сгенерированные S-термы. Рассмотрим вычисление S-термов. Единственное алгебраическое правило (S-правило), которое может быть использовано, состоит в следующем: любой подтерм S-терма, имеющий вид (((SA)B)C), где A, B, C - также S-термы, может быть переписан как ((AC)(BC)), то есть Context1(((SA)B)C)Context2 -> Context1((AC)(BC))Context2.

Применение этого правила к S-терму называется редукцией S-терма. Возможны разные способы (стратегии) выбора подтермов для применения S-правила. Последовательное применение S-правила к S-терму до тех пор, пока это возможно, называется нормализацией.

Пример цепочки редукции S-терма: ((((SS)(SS))S)(SS)) -> (((SS)((SS)((SS)S))(SS)) -> ((S(SS))(((SS)S)(SS))) -> ((S(SS))((S(SS))(S(SS)))).

Задание 2. Предложите эффективную структуру данных для представления S-термов, облегчающую применение S-правила. Напишите две процедуры: "readterm" и "printterm". Первая из них преобразует S-термы в Вашу структуру данных из формы, порождаемой процедурой "gensterm"; вторая преобразует S-термы из Вашей структуры в форму, порождаемую процедурой "gensterm". Ваша программа должна демонстрировать эти преобразования.

Задание 3. Напишите процедуру "reduce", выполняющую один шаг редукции в соответствии с S-правилом над заданным подтермом S-терма в Вашем представлении. Программа должна демонстрировать это.

Задание 4. Напишите процедуру "normalize", которая в заданном S-терме должна последовательно выбирать подтермы и применять S-правило до тех пор, пока дальнейшии редукции станут невозможными, либо число шагов не достигнет некоторого максимума, например 30. Ваша программа должна демонстрировать это.

Задание 5. Объедините все процедуры в одну программу, которая:

- запрашивает у пользователя длину n;
- порождает с помощью процедуры "gensterm" S-термы заданной длины;
- преобразует все S-термы в Ваше представление;
- нормализует их (если это возможно);
- выводит в качестве результата нормализованные S-термы;
- выводит последовательно число шагов редукции, совершенных над каждым S-термом, либо сообщение "not normalized", если нормализация требует более 30 шагов;
- выводит число ненормализованных термов и общее число всех S-термов заданной длины n.

Используются технологии uCoz