G. Складывание карты
Ограничения: время – 1s/2s, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Джордж и Фред, чтобы не скучать во время поездки, играют в следующую игру при помощи дорожной карты.
Карта имеет прямоугольную форму и сгибами разделена на квадраты. Карта имеет размеры `W` квадратов по горизонтали
и `H` квадратов по вертикали (`1≤\ W,\ H\ ≤\ 10^6`). Ходы в игре делаются по очереди. Тот из игроков,
который не может сделать очередной ход, проигрывает. Ход заключается в выполнении сгиба по вертикали или горизонтали
по линии сгиба. Таким образом игра заканчивается, когда карта превратится в квадрат `1\ times\ 1`.
Вы должны написать подпрограмму с именем game, реализующую выигрышную стратегию для этой игры.
Подпрограмме в качестве параметров передаются размеры карты.
void game(int *w, int *h); // С/С++
procedure game(var W,H:integer); // Pascal
Для выполнения хода ваша подпрограмма должна вызывать подпрограмму robot с указанием хода.
void robot(int t); // С/С++
procedure robot(t:integer); // Pascal
Эта подпрограмма делает изменения значений `W` и `H`, вводит ход соперника и опять изменяет эти переменные.
Аргумент `t\ >\ 0` используется для сгибания карты по горизонтали –
сгибается полоса карты слева шириной `t` (`t\ <\ W`), карта при этом уменьшается до размера `max(t,W-t)\ times\ H`; `t\ <\ 0` используется для сгибания карты по вертикали –
сгибается полоса карты сверху высотой `-t` (`-t\ <\ H`). В случае, если компьютер не может сделать ход,
вы должны выйти из подпрограммы game.
В качестве начальной позиции подпрограмме game передается позиция, в которой существует выигрышный ход.
Пересылаемое на проверку решение должно содержать только
подпрограмму game, вспомогательные функции, команды #include (в C/C++) и глобальные переменные.
В подпрограммах не должен выполняться ввод или вывод.
Пример подпрограммы на C/C++
void game(int *w, int *h)
{ while(*w>1 || *h>1)
{
if(*w>1)
robot(*w/2);
else
robot(-(*h/2));
}
}
Пример подпрограммы на Pascal
procedure game(var W,H:integer);
begin
while (W>1) or (H>1) do
if W>1 then
robot(W div 2)
else
robot(-(H div 2));
end;