【趣题】几堆石子轮流捡,谁捡到最后的石子算输的游戏

这是一个关于两人轮流从三堆石子中取石子的游戏,目标是避免拿到最后一颗石子。文章介绍了游戏规则,分析了先手必胜的策略,并通过代码展示了如何判断当前局势是否会导致必败状态。最后,讨论了当规则改为谁拿到最后一颗石子谁赢时,游戏策略变为基于异或运算的逻辑。
摘要由CSDN通过智能技术生成

一 题目描述

有三堆石子,分别为7,5,3个每堆,两个人轮流进行如下操作:

    选择一堆(石子数不为0);

    从这堆石子中取走至少一个,至多全部的石子;

直到有人拿走最后一颗石子,该人算输。

二 思路

当时直觉上这样的题目先手必胜概率很大,但今天才有机会用代码写了一下。

1. 这种棋子数量不多的情况下,完全可以采用暴力求解的手段。

2. 如果基于目前局势,能够导致对手必输的局势,那么目前选手必胜;否则,目前选手必败。这个非黑即白的逻辑解释如下:

    我们可以从最终的情况逐步往上添加石子构建到初始情况。比如1-0-0的情况是先手必败情况,那所有一次操作能够形成1-0-0的局势都认为是先手必胜;如果某一个局势不能通过减少石子变为任何一个先手必败的情况,那它只能是通过先手必胜的局势添加石子构建而来,换句话说,无论这个局势下怎么动,都是留给对手一个先手必胜的局势,这种情况下,先手必败。

3. 通过局势生成局势码,避免重复计算,进行剪枝。(实际效果:将递归调用次数从98708次降低到5592次)

三 代码

 

 
 
# -*- coding:UTF-8 -*-
cnt = 0 # 计数器,看调用函数的次数
deadSet = set() # 因为涉及一些重复判断,所以使用一个
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值