54张牌两人轮流抽'1-4'张,先抽几张,才能确保最后一张一定被自己抽到

本文探讨了一个简单的游戏策略问题,即如何在轮流取牌的游戏中确保获胜。通过Python编程实现了一种算法来找出最优的首次取牌数,确保玩家能够赢得最终的一张牌或者避免输掉游戏。
部署运行你感兴趣的模型镜像

内容如标题,原题是小学四年级的一个动脑筋。


稍微改动一下,比如总数有N张牌,两人轮流抽'1-m'张,先抽几张,才能确保最后一张一定被自己或对手抽到。

python写的,代码如下:

def get_answer():
    total = input('please input the number of total card:\n')
    every_card = input('please input the number of everyone should take:\n')
    last_status = input("please define take the last one win or lose:\n,win input '1', lose input '0'\n")
    # last_status = True

    loop_num = int(math.ceil(total / every_card))
    for j in range(1, every_card + 1):
        for i in range(loop_num):
            if last_status:
                if total == j + (i * (every_card + 1)):
                    plan_dic = dict()
                    plan_dic['first_take'] = j
                    plan_dic['held_num'] = every_card + 1
                    plan_dic['times'] = i
                    print plan_dic
            else:
                if total == j + ((i - 1) * (every_card + 1)) + every_card:
                    plan_dic = dict()
                    plan_dic['first_take'] = j
                    plan_dic['held_num'] = every_card + 1
                    plan_dic['times'] = i
                    print plan_dic

其实还可以再改动一下,比如N个人轮流抽,或许这样没有解的情况会比较多了。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

# P2482 [SDOI2010] 猪国杀 ## 目描述 ### 游戏背景 《猪国杀》是一种多猪类回合制游戏,一共有 $3$ 种角色:主猪,忠猪,反猪。每局游戏主猪有且只有 $1$ 只,忠猪和反猪可以有多只,每只猪扮演 $1 $ 种角色。 ### 游戏目的 主猪 / $\texttt{MP}$:自己存活的情况下消灭所有的反猪。 忠猪 / $\texttt{ZP}$:不惜一切保护主猪,胜利条件与主猪相同。 反猪 / $\texttt{FP}$:杀死主猪。 ### 游戏过程 游戏开始时,每个玩家手里都会有 $4$ ,且体力上限和初始体力都是 $4$ 。 开始游戏时,从主猪开始,按照逆时针方向(数据中就是按照编号从 $ 1 , 2, 3 \ldots n , 1 \ldots $ 的顺序)依次行动。 每个玩家自己的回合可以分为 2 个阶段: * **摸阶段**:从堆顶部摸 $2$ ,依次放到手的最右边; * **出阶段**:你可以使用任意,每次使用的时候都使用最靠左的能够使用的。当然,要满足如下规则: 1. 如果没有猪哥连弩,每个出阶段只能使用 $1$ 次「杀」来攻击; 2. 任何被使用后被弃置(武器是装备上);被弃置的以后都不能再用,即与游戏无关。 ### 各种介绍 每用 $1$ 个字母表示,字母代表的种类。 #### 基本 - 『桃 / $\texttt{P}$』在自己的回合内,如果自己的体力值不等于体力上限,那么使用 $1$ 个桃可以为自己补充 $1$ 点体力,否则不能使用桃;桃只能对自己使用;在自己的回合外,如果自己的血变为 $0$ 或者更低,那么也可以使用。 - 『杀 / $\texttt{K}$』在自己的回合内,对攻击范围内除自己以外的 $1$ 名角色使用。如果没有被『闪』抵消,则造成 $1$ 点伤害。无论有无武器,杀的攻击范围都是 $1$。 - 『闪 / $\texttt{D}$』当你受到杀的攻击时,可以弃置 $1$ 闪来抵消杀的效果。 #### 锦囊 - 『决斗 / $\texttt{F}$』出阶段,对除自己以外任意 $1$ 名角色使用,由目标角色先开始,自己和目标角色轮流弃置 $1$ 杀,首先没有杀可弃的一方受到 $1$ 点伤害,另一方视为此伤害的来源。 - 『南猪入侵 / $\texttt{N}$』出阶段,对除你以外所有角色使用,按逆时针顺序从使用者下家开始依次结算,除非弃置 $1$ 杀,否则受到 $1$ 点伤害。 - 『万箭齐发 / $\texttt{W}$』和南猪入侵类似,不过要弃置的不是杀而是闪。 - 『无懈可击 / $\texttt{J}$』在目标锦囊生效前抵消其效果。每次有 $1$ 锦囊即将生效时,从使用这锦囊的猪开始,按照逆时针顺序,依次得到使用无懈可击的机会;效果:用于决斗时,决斗无效并弃置;用于南猪入侵或万箭齐发时,当结算到某个角色时才能使用,当前角色不需弃置并且不会受到伤害(仅对 $1$ 个角色产生效果);用于无懈可击时,成为目标的无懈可击被无效。 #### 装备 - 『猪哥连弩 / $\texttt{Z}$』武器,攻击范围 $1$ ,出阶段你可以使用任意杀; 同一时刻最多只能装 $1$ 把武器;如果先前已经有了 $1$ 把武器,那么之后再装武器的话,会弃置以前的武器来装现在的武器。 ### 特殊事件及概念解释 * **伤害来源**:杀、南猪入侵、万箭齐发的伤害来源均是使用该的猪,决斗的伤害来源如上; * **距离**:只猪的距离定义为沿着逆时针方向间隔的猪数 $+1$ 。即初始时 $1$ 和 $2$ 的距离为 $1$ ,但是 $2$ 和 $1$ 的距离就是 $n-1$ 。注意一个角色的死亡会导致一些猪距离的改变; * **玩家死亡**:如果该玩家的体力降到 $0$ 或者更低,并且自己手中没有足够的桃使得自己的体力值回到 $1$ ,那么就死亡了,死亡后所有的(装备区,手区)被弃置; * **奖励与惩罚**:反猪死亡时,最后一个伤害来源处(即使是反猪)立即摸 $3$ 。忠猪死亡时,如果最后一个伤害来源是主猪,那么主猪所有装备、手被弃置。 注意:一旦达成胜利条件,游戏立刻结束,因此即使会摸 $3$ 或者还有可以用也不用执行了。 现在,我们已经知道每只猪的角色、手,还有堆初始情况,并且假设每个角色会按照如下的行为准则进行游戏,你需要做的就是告诉小猪 iPig 最后的结果。 ### 几种行为 * **献殷勤**:使用无懈可击挡下南猪入侵、万箭齐发、决斗;使用无懈可击抵消表敌意; * **表敌意**:对某个角色使用杀、决斗;使用无懈可击抵消献殷勤; * **跳忠**:即通过行动表示自己是忠猪。跳忠行动就是对主猪或对某只已经跳忠的猪献殷勤,或者对某只已经跳反的猪表敌意; * **跳反**:即通过行动表示自己是反猪。跳反行动就是对主猪或对某只已经跳忠的猪表敌意,或者对某只已经跳反的猪献殷勤。 **注意:忠猪不会跳反,反猪也不会跳忠;不管是忠猪还是反猪,能够跳必然跳**。 ### 行动准则 #### 共性 * 每个角色如果手里有桃且生命值未满,那么必然吃掉; * 有南猪入侵、万箭齐发、必然使用;有装备必然装上; * 受到杀时,有闪必然弃置; * 响应南猪入侵或者万箭齐发时候,有杀 / 闪必然弃置; * 不会对未表明身份的猪献殷勤(**包括自己**)。 #### 特性 - 主猪: + 主猪会认为「没有跳身份,且用南猪入侵 / 万箭齐发对自己造成伤害的猪」是**类**反猪(没伤害到不算,注意类反猪并没有表明身份),如果之后跳了,那么主猪会重新认识这只猪; + 对于每种表敌意的方式,对逆时针方向能够执行到的第一只类反猪或者已跳反猪表;如果没有,那么就不表敌意; + 决斗时会不遗余力弃置杀; + 如果能对已经跳忠的猪或自己献殷勤,那么一定献;如果能够对已经跳反的猪表敌意,那么一定表。 - 忠猪: + 对于每种表敌意的方式,对「逆时针方向能够执行到的第一只已经跳反的猪」表,如果没有,那么就不表敌意; + 决斗时,如果对方是主猪,那么不会弃置杀,否则,会不遗余力弃置杀; + 如果有机会对主猪或者已经跳忠的猪献殷勤,那么一定献。 - 反猪: + 对于每种表敌意的方式,如果有机会则对主猪表,否则,对「逆时针方向能够执行到的第一只已经跳忠的猪」表,如果没有,那么就不表敌意; + 决斗时会不遗余力弃置杀; + 如果有机会对已经跳反的猪献殷勤,那么一定献。 限于 iPig 只会用 P++ 语言写 A + B,他请你用 Pigcal (Pascal)、P (C) 或 P++ (C++) 语言来帮他预测最后的结果。 ## 输入格式 输入文件第一行包含两个正整数 $ n $ $ (2 \leqslant n \leqslant 10) $ 和 $m$ $ (m \leqslant 2000) $,分别代表玩家数和堆中的数量。数据保证的数量够用。 接下来 $n$ 行,每行 $5$ 个字符串,依次表示对第 $i$ 只猪的角色和初始 $4 $ 描述。编号为 $1$ 的肯定是主猪。 再接下来一行,一共 $m$ 个字符串,按照从堆顶部到堆底部的顺序描述每。 **注意:所有的相邻的两个字符串都严格用 $1$ 个空格隔开,行尾没有多余空格**。 ## 输出格式 输出数据第一行包含一个字符串代表游戏结果。如果是主猪胜利,那么输出 $\texttt{MP}$ ,否则输出 $\texttt{FP}$ 。数据保证游戏总会结束。 接下来 $n$ 行,第 $i$ 行是对第 $i$ 只猪的手描述(注意只需要输出手),按照手从左往右的顺序输出,相邻用 $1$ 个空格隔开,行末尾没有多余空格。如果这只猪已阵亡,那么只要输出 $\texttt{DEAD}$ 即可。 **注意:如果要输出手而没有手的话,那么只需输出 $1$ 个空行**。 **由于数据问,若堆已空,按照每次抽到的都是最后一张。** ## 输入输出样例 #1 ### 输入 #1 ``` 3 10 MP D D F F ZP N N N D FP J J J J F F D D J J F F K D ``` ### 输出 #1 ``` FP DEAD DEAD J J J J J J D ``` ## 说明/提示 ### 样例解释 第一回合: * 主猪没有目标可以表敌意; * 接下来忠猪使用了 $3$ 南猪入侵,主猪掉了 $3$ 点体力,并认为该角色为类反猪,$3$ 号角色尽管手里有无懈可击,但是因为自己未表明身份,所以同样不能对自己用,乖乖掉 $3$ 点体力; 下一回合: * 反猪无可出; * 接下来主猪对着类反猪爆发,使用 $4$ 决斗,忠猪死亡,结果主猪弃掉所有; * 下来反猪摸到 $1$ 杀直接杀死主猪获胜。 ### 子任务 一共 $20$ 组测试数据,每个点 $5$ 分。 $10\%$ 的数据没有锦囊,另外 $20\%$ 的数据没有无懈可击。
最新发布
08-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值