eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач

НИМ

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