Leetcode Note: Go - Nim Game
Nim Game - LeetCode
https://leetcode.com/problems/nim-game/
- Go 言語で取り組んだメモ
所感
- nim game
- テーブルの上に石の山ガアあり、交互に交代して先に進む
- 手番で 1 - 3 個の石を取り除く
- 最後の石を取り除いた人が勝ち
- 石の数 n とした時、適切なプレイをして勝てれば true 負ければ false を返す
回答
Nim Game - LeetCode
https://leetcode.com/problems/nim-game/solution/
func canWinNim(n int) bool {
return n % 4 != 0
}
- 4 で割り切れない場合は必ず勝てるので、それを判定すれば良い
- 小さなケースで考える
- 石が 1 or 2 or 3 個の場合、自分の番で石を全て取れば勝てる
- 石が 4 個の場合、どれだけ石をとっても相手が最後の石を取れるので負けてしまう
- 勝つためには、自分の手番で石の山がちょうど4個になっている必要がある
- 大きなケースで考える
- 石が 5 or 6 or 7 個の場合、相手が負けるように 4個 の石を残すように石を取れば勝てる
- スケールと一般化
- n が 4, 8, 12, 16, … と 4 の倍数であれば同じパターンを繰り返すことが出来る
実装はかなり簡単だが 4 の倍数で負けるという式の構築が出来なかった・・・