printЗадачи очного тура личного первенства

printG. Складывание карты

Ограничения: время – 1s/2s, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод copy
Послать решение 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;
loading