ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
Задача 102887
Условие
Имеется таблица M × N, в каждой ячейке которой записано либо целое число,
либо арифметическая формула. В формулах могут присутствовать целые числа,
знаки *, /, +, -, (, ), пробелы и ссылки на значения из других ячеек таблицы,
записываемые в виде {НомерCтроки, НомерCтолбца} (например, {1,10}).
Требуется вычислить значения во всех ячейках заданной таблицы.
Решение
Скачать архив тестов и решений Пусть нам требуется узнать значение какой-либо из ячеек, имеющей статус «еще не вычислялась». Меняем ее статус на «вычисляется» и производим синтаксический разбор формулы, записанной в ней. Для этого можно использовать метод рекурсивного спуска [Шень 95, гл. 13]. Если мы встретим ссылку на ячейку, имеющую статус «значение известно», то используем это значение. Если мы встретим ссылку на ячейку, имеющую статус «значение не может быть вычислено», то значение в анализируемой ячейке также не может быть вычислено и мы для нее устанавливаем тот же самый статус и заканчиваем разбор. Встретив ссылку на ячейку, значение которой еще не вычислялось, рекурсивно переходим к нахождению ее значения. Рассмотрим, наконец, случай ссылки на ячейку со статусом «вычисляется». В этой ситуации мы обнаружили цикл из ссылок, который не может быть разрешен. Меняем статус анализируемой ячейки на «значение не может быть вычислено» и заканчиваем разбор. В случае, когда значения всех ячеек, на которые ссылается текущая, были подсчитаны и в процессе разбора формулы не возникало делений на ноль, статус анализируемой ячейки меняется на «уже вычислялась, значение известно». Легко видеть, что описанный процесс представляет собой обход в глубину графа, вершины которого соответствуют ячейкам таблицы, а ребра – ссылкам из одной ячейки на другую. Присваивание значений ячейкам происходит в том же порядке, что и присваивание новых номеров вершинам ациклического графа при выполнении топологической сортировки [Липский 88, п. 3.4; Кнут 76, п. 2.2.3]. Источники и прецеденты использования |
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|
![]() |
Проект осуществляется при поддержке