Игра состоит в том, что у вас есть N
кучи камней, на каждом шагу игрока он должен удалить хотя бы 1 камень из кучи, а игрок, который удаляет последний камень, теряет.Где мой недостаток в решении игры Misere Nim
я написал победитель в дюжине случаев, начиная с базового случаем
/*
stones | winner | N | ones
========================================
{1} | Second | 1 | 1
{i}, i>1 | First | 1 | 0
{1,1} | First | 2 | 2
{1,i}, i>1 | First | 2 | 1
{i,j}, i,j>1 | Second | 2 | 0
{1,1,1} | Second | 3 | 3
{1,1,i}, i>1 | First | 3 | 2
{1,i,j}, i,j>1 | First | 3 | 1
{i,j,k}, i,j,k>1 | First | 3 | 0
{1,1,1,1} | First | 4 | 4
{1,1,1,i} | First | 4 | 3
{1,1,i,j}, i,j>1 | Second | 4 | 2
{1,i,j,k}, i,j,k>1 | First | 4 | 1
{i,j,k,m}, ... | Second | 4 | 0
*/
и из что я думаю, что я вывел формулу
static string GetWinner(int[] piles)
{
int n = piles.Length, m = piles.Count(stones => stones == 1);
if(m == n) // one stone per pile
return n % 2 == 0 ? "First" : "Second";
// if here, m < n
return n % 2 == 0 ? (m % 2 == 0 ? "Second" : "First") : "First";
}
но это провалив тест, {2,1,3}
, что должно привести к "Second"
.
Я стараюсь использовать следующий факт.
- Любое количество камней в куче, которая больше, чем
2
даст те же результаты, если бы это было2
. Причина в том, что если он больше, чем2
, и игрок не сжимает кучу до1
на этом ходу, тогда игрок в основном дает своему противнику ход.
Однако, там может быть что-то я неправ ..
Я не понимаю, почему вы тестируете N, игра связана только с М, насколько я мог понять, так или иначе, возможно, вы захотите сделать свой вопрос яснее –
, сколько игроков есть? если цель игры состоит в том, чтобы объявить 1 более свободным, это означает, что должно быть более 1 победителя. так зачем искать победителя, когда вам нужно найти свободную – waynemodz