【算法】博弈论

本文介绍了两种经典的博弈论游戏:巴什博奕和Nim博弈。在巴什博奕中,当物品总数n对(m+1)取余为0时,后手玩家有必胜策略;而在Nim博弈中,若所有堆石子数量的异或结果为0,则先手玩家有必胜策略。通过理解这些策略,玩家可以在游戏中制定最优方案,以求获胜。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 巴什博奕

只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个。最后取光者得胜。

方法:

最后取光者赢:n%(m+1) == 0 ,后手胜;

最后取光者输:(n-1)%(m+1) == 0 ,后手胜;

例题:本游戏是一个二人游戏,有一堆石子一共有n个,两人轮流进行,每走一步可以取走1…m个石子,最先取光石子的一方为胜,如果游戏的双方使用的都是最优策略,请输出哪个人能赢。

#先手胜则返回true
def bashGame(n,m):
    if n%(m+1) != 0:
        return True
    else:
        return False

2. Nim博弈

有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

方法:

先拿空者胜:取所有堆的石子个数的异或,结果为0 则先手赢。

例题:

现在有一个整数数组,其元素值均为1-n范围内的某个整数,现在你和你的朋友在玩一个游戏,游戏的目的是把数组清空,你们轮流操作,你是先手,每次操作你可以删除数组中值为某个数的元素任意多个(当然数组中值为这个数的元素个数应大于等于你删除的个数,且你至少要删除一个数)。最先把数组清空的人获得胜利。假设你们都采取最优策略,请你计算你能否获得胜利。

给定一个整数数组A和元素个数n。请返回一个整数,1代表你能获胜,0代表你不能获胜。

class Clear:
    def getWinner(self, A, n):
        #nim博弈
        #所有堆所含数的个数取异或,为0先手胜,为1后手胜
        if n <= 1:
            return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值