eolymp
bolt
Спробуйте наш новий інтерфейс для відправки розв'язків

НIM

\textbf{Увага! Цю задачу подано у демонстраційному режимі.} \textbf{Тести у системі поки що відсутні} В гру Нiм грають двоє. Є (\textbf{2} ≤ \textbf{N} ≤ \textbf{100}) купок камiнцiв. Гравцi по черзi беруть камiнцi з купок. Виграє той, хто вiзьме останнiй камiнець. на кожному ходi гравецьможе брати камiнцi не бiльше нiж з \textbf{K} (\textbf{1} ≤ \textbf{K} ≤ \textbf{N}) купок, але повинен взяти хоча б один камiнець. На початку гри в кожнiй купцi \textbf{0} < \textbf{H\[i\]} < \textbf{1000000000} камiнцiв. \textit{\textbf{Завдання}}. Напишiть програму, яка буде грати в Нiм та, по можливостi, вигравати. \textit{\textbf{Технічні умови}}. Пiд час перевiрки до Вашої програми буде приєднано (linked) модуль перевiрки, який називається CHECK.* (PAS, C чи CPP). Цей модуль мiстить \textbf{3} функцiї: \textbf{InitGame}, \textbf{JudgeTurn}, \textbf{PartTurn}. Функцiя \textbf{InitGame} використовується для зчитування вхiдних даних з тестового файлу. Вона має \textbf{4} вихiдних параметри: \textbf{N} та \textbf{K} - кiлькостi купок: масив \textbf{Н} - кiлькостi камiнцiв в купках, \textbf{First} - хто перший ходить. Пiсля виклику цiєї функцiї \textbf{N} та \textbf{K} отримають вiдповiднi значення, в перших \textbf{N} елементах масиву \textbf{Н} будуть кiлькостi камiнцiв в купках, а \textbf{First} приймає значення \textbf{0}, якщо першою ходить програма переiвiрки (журi) та \textbf{1}, якщо перщою ходить програма учасника. Звернiть увагу, що Ваша програма не повинна самостiйно читати вхiднi данi, це треба робити тiльки за допомогою функцiї \textbf{InitGame}. Функцiю \textbf{JudgeTurn} Ваша програма буде викликати, коли їй потрiбно буде отримати черговий хiд журi. Єдиний вихiдний параметр цiєї функцiї - масив \textbf{Т}, першi \textbf{N} елементiв якої мiстять кiлькостi камiнцiв, що перевiряюча програма бере з купок. Вiдповiднiсть ходу умовам гри гарантується. Функцiю \textbf{PartTurn} Ваша програма буде викликати, щоб повiдомити перевiряючiй програмi свiй хiд. Запишiть свiй хiд в першi \textbf{N} елементiв масиву \textbf{Т}. Кожна з цих функцiй повертає \textbf{1}, якщо все гаразд, або \textbf{0}, якщо виникла помилка, i Ваша програма може припиняти роботу. На отриманiй Вами дискетi буде модуль перевiрки (CHECK.*) та головний модуль (NIM_KBD.*). Вони надаються тiльки для того, щоб Ви могли швидко почати роботу над розв'язком, не втрачаючи час на технiчнi проблеми. Модуль CHECK виконує зчитування даних з клавiатури, перевiрку ходiв учасника та послiдовностi викликiв функцiї, але дуже погано грає. Журi при перевiрцi буде використовувати iнший. Модуль NIM_KBD викликає функцiї модуля CHECK в потрiбнiй послiдовностi, але замiсть обчислення наступного ходу учасника читає його з клавiатури. Ваша задача i полягає в тому, щоб функцiя MakeTurn обчислювала наступний хiд. Журi не наполягає на використаннi означених файлiв, але ваш розв'язок повинен коректно взаємодiяти з модулем CHECK. \textit{\textbf{Примітка}}. При перевiрцi серед тестiв будуть такi частковi випадки: 1) \textbf{N=2}, \textbf{K=1}; 2) \textbf{N=3}, \textbf{K=1}; 2) \textbf{N} > \textbf{3}, \textbf{K=1}. Програма- розв'язок - NIM.PAS, NIM.CPP, NIM.C. \textit{\textbf{Приклад}} \textbf{Учасник: (1,1,0,0), залишилось (2,3,5,6)} \textbf{Журi: (0,0,1,1), залишилось (2,3,4,5)} \textbf{Учасник: (0,0,1,1), залишилось (2,3,3,4)} \textbf{Журi: (1,1,0,0), залишилось (1,2,3,4)} \textbf{Учасник: (0,0,0,4), залишилось (1,2,3,0)} \textbf{Журi: (0,0,1,0), залишилось (1,2,2,0)} \textbf{Учасник: (1,2,0,0), залишилось (0,0,2,0)} \textbf{Журi: (0,0,2,0), залишилось (0,0,0,0)} \textbf{Виграло журi (але учасник мав шанс!!!)}
Ліміт часу 1 секунда
Ліміт використання пам'яті 64 MiB
Автор Віталий Бондаренко
Джерело X Всеукраїнська олімпіада з інформатики, 1997 р.