初中的时候被一个女同学邀请玩与这个类似的抽扑克牌游戏,我到现在才明白,哈哈,那个女同学已经考上重点985数学系了。故写此解法。
一回合内两个人抽牌,总数可以是2,3,4,5,6.要想保证最优解,则必须将局面控制在手中,当对方出牌1张或2张或3张时,你总可以对应出牌3张或2张或1张,所以假设每回合的抽牌总数是4张。
我方在先手时可以出牌m=1,2,3张。对于这3中情况,求r=(n-m)%4,当r为0时,我在最后一个回合总能抽到牌;当r>3时,对方最后一次总不能抽完牌。限定这个条件来计算就可以了。
实际上,若r+m=4时,对于我方的任意先手情况,对方均可以抽出相应的牌。因此当r+m>4即n%4>0时,我方才能保证获胜。所以就能简化到代码:
return (n%4>0)
原解法:
def can_win_nim(n) case n when 1,2,3 return true when 4 return false end choices = [1,2,3] choices.each do |a| dt = ((n-a) % 4) if (dt == 0 || dt > 3) then puts "n=#{n}, a=#{a}"; return true end end return false end
我在leetcode上写了,这里也写一份。