巴什博弈

leetcode NimGame

水题水出了自己不会的东西。。。
题目只要了解了巴什博弈就很简单,侮辱智商对吧,,那这里补下个人理解的巴什博弈论

设石头数为n,最多可以拿的数量为m,先了解,如果给对方留下m+1数量的石头,对方就不可能赢了,这个是简单模拟出来的。

然后推广出 只要给对方留下m+1的倍数,对方就不可能赢
假设给予对方的石头数n = (m+1)* k; 对方可以取的数为k,
(k >=1, k <=m)
,那么我只需取(m+1) - k (此项一定大于0) 然后对方剩下石头数n = (m+1)*(k-1)
以此类推, 对方的石头数最后一定为m+1,由上方结论得出,对方并不可能赢

回到题目,只有两个可能的石头数
(1)n = (m+1)* k
(2) n = (m+1)* k + s (s<=m)

第一种情况先手方必输,因为给自己留下了(m+1)倍数的石头
第二种情况先手方必赢,因为只要取出s个石头,就给对方留下了(m+1)的石头数

public static boolean canWinNim(int n) {
     return n%4!=0;
 }

你可能感兴趣的:(水题)