Вказівки щодо розв'язання завдання № 6
відбірково-тренувальних зборів
команди міста Києва

6.1. Камінці (теорія ігор)

Загальний підхід той самий, що й у задачі 5.2. «Ряд фішок», але з таким застереженням: якщо позицією вважати набір камінців у всіх ямках за виключенням крайньої ямки праворуч, то оперативної пам'яті достатньо навіть для Turbo Pascal'ю, щоб зберігати кожну позицію та ходи з неї. Не передбачено створення коду на основі попередніх розрахунків.

6.2. Вечірка (оптимізований перебір у логічних міркуваннях)

Спочатку потрібно встановити ім'я персонажу, що є першим щодо алфавітного порядку і стоїть на першому місці з урахуванням того, що кодування українських літер не відповідає алфавітному порядку. Далі потрібно використати такий алгоритм, у якому для задач «чистої математики» замість «з умов вхідного файлу» потрібно читати: «з умови задачі».

Єдиний спосіб розв'язання логічних задач

  1. Робимо всі можливі висновки з умов вхідного файлу і вже зроблених висновків, зазначаючи, що ці висновки отримано, а відповідні частини вже використано на початковому нульовому рівні.

  2. Якщо отримано суперечність (два імені або два фахи припадають на одне й те саме місце), то припипяємо виконання алгоритму.

  3. Якщо отримано відповідь, то припипяємо виконання алгоритму після запису відповіді.

  4. Збільшуємо рівень прийняття гіпотез на 1.

  5. Робимо на поточному рівні прийняття гіпотез послідовно всі можливі гіпотези (про ім'я чи фах, що припадають на певне «вільне» місце).

  6. Для прийнятої гіпотези робимо всі можливі висновки з умов вхідного файлу, зробленої гіпотези і вже зроблених висновків, зазначаючи, що ці висновки отримано, а відповідні умови використано на даному рівні прийняття гіпотез. В результаті можемо потрапити в один з таких трьох станів:

    • отримано один з варіантів відповіді. Тоді запам'ятовуємо його, відміняємо гіпотезу найвищого рівня і всі її наслідки, після чого приймаємо наступну гіпотезу на цьому рівні й переходимо до виконання пункту 6. Якщо всі гіпотези на даному рівні розглянуто, то зменшуємо рівень прийняття гіпотез на 1. Якщо отримуємо рівень 0, то припиняємо перебір гіпотез, інакше переходимо на виконання пункту 5;

    • отримано суперечність. Тоді відміняємо гіпотезу найвищого рівня і всі її наслідки, після чого приймаємо наступну гіпотезу на цьому рівні й переходимо до виконання пункту 6. Якщо всі гіпотези на даному рівні розглянуто, то зменшуємо рівень прийняття гіпотез на 1. Якщо отримуємо рівень 0, то припиняємо перебір гіпотез, інакше переходимо на виконання пункту 5;

    • не отримано ні відповіді, ні суперечності. Тоді збільшуємо рівень прийняття гіпотез на 1 і переходимо до виконання пункту 5.

Поданий алгоритм є істотно рекурсивним. Інакше кажучи, код програми обов'язково містить рекурсивні процедури чи функції або мітки.