nim游戏的ruby解法与分析

初中的时候被一个女同学邀请玩与这个类似的抽扑克牌游戏,我到现在才明白,哈哈,那个女同学已经考上重点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上写了,这里也写一份。

猜你喜欢

转载自www.cnblogs.com/uu6crella/p/12818576.html