Чтобы подвести итог игре, есть N башни высотой M, на каждом повороте игрок может уменьшить башню до числа, которое делит ее высоту, но не равно ее высоте, и цель состоит в том, чтобы сделать вашего противника невозможным движется, когда его очередь.Есть ли способ упростить мое мышление о N башнях игры M высот?
Например, если N=2,M=2
, то первый игрок проиграет, потому что единственные шаги, которые он может сделать, - это уменьшить одну из башен до высоты 1, после чего единственный ход, который может сделать другой игрок, - уменьшить другую башню до высоты 1 и теперь у первого игрока нет ходов.
Я начал писать об этом, но мне становится слишком сложно увидеть «шаблон» на нестандартном M
s, таком как 4
. Есть ли лучший способ, я должен думать об этом?
1 --> Lose
1 1 --> Lose
1 1 1 --> Lose
etc.
2 --> Win
2 2 --> Lose
2 2 2 --> Win
2 2 2 2 --> Lose
etc.
3 --> Win
3 3 --> Lose
3 3 3 --> Win
3 3 3 3 --> Lose
etc.
4 --> Win
4 4 --> Lose (see tree below)
4,4 1's turn
/ \
/ \
/ \
/ \
/ \
2,4 1,4 2's turn
/\ \ /\
/ \ \ / \
/ \ \ / \
1,4 2,2 1,2 1,1 1,2 1's turn
/\ \ \ \
/ \ \ \ \
1,1 1,2 1,2 1,1 1,1 2's turn
/ \
/ \
1,1 1,1 1's turn
Мой способ расчета ли игрок 1 или 2 победит, как
static int Winner(int n, int m)
{
if(m == 1)
return 2;
else if(IsPrime(m))
return n % 2 == 0 ? 2 : 1;
else
{
// ... ??
}
}
EDIT: Ничего себе, я только что сделал дикое предположение с
static int Winner(int n, int m)
{
if(m == 1)
return 2;
else
return n % 2 == 0 ? 2 : 1;
}
и прошло все тестовые примеры проблемы вызова. Поэтому я «решил» это, не понимая почему.
Какова шкала 'N' и' M'? – amit
@amit 1 <= N, M <= 10^6. Но почему это имеет значение для моего вопроса? – user6048670
Потому что для небольших проблем вы обычно стоите менее эффективным решением - и нет необходимости переучивать его. OTOH, иногда проблемы большого масштаба просто неосуществимы, и вы будете сражаться для приближения. Ограничение проблемы имеет решающее значение для понимания инструментов и вашего распоряжения, чтобы решить эту проблему. – amit