【算法】经典博弈论问题——巴什博弈 python

ops/2025/1/24 12:54:59/

目录

  • 前言
  • 巴什博弈(Bash Game)
  • 小试牛刀
  • PN分析
  • 实战检验
  • 总结


前言


博弈类问题大致分为:
公平组合游戏、非公平组合游戏(绝大多数的棋类游戏)和 反常游戏



巴什博弈(Bash Game)


一共有n颗石子,两个人轮流拿,每次可以拿1~m颗石子
最先取光石子的一方为胜(没有石子可以拿的人为败),根据n、m返回谁赢


分析

我们从最简单的情景开始分析
当石子有 1−m 个时,先手必胜(一次拿完)
当石子有m+1个时,先手无论拿几个,后手都可以拿完,先手必败
不难发现:面临 m+1个石子的人一定失败。
这样的话,最优策略一定是:通过拿走石子,使得对方拿石子时还有 m+1个剩余

推广至一般情况:
【1】当n不可被m+1整除时,先手必胜
为什么? n %(m+1)= r,先手拿走 r ,后手即面临 m+1的整数倍颗石子,必败
【2】同理,当n可被m+1整除时,先手必败


测试链接 hduoj1846


示例code:

python">c = int(input())
for _ in range(c):n, m = map(int, input().split())if n % (m + 1) == 0:print("second")else:print("first")

小试牛刀


hduoj2188

在这里插入图片描述

题解:

python"># 和前面几乎一样的code
c = int(input())
for _ in range(c):n, m = map(int, input().split())if n % (m + 1) != 0:print("Grass")else:print("Rabbit")

PN分析


在这里插入图片描述


实战检验


Roy&October之取石子

题目背景

Roy 和 October 两人在玩一个取石子的游戏。

题目描述

游戏规则是这样的:共有 n n n 个石子,两人每次都只能取 p k p^k pk 个( p p p 为质数, k k k 为自然数,且 p k p^k pk 小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了。

现在 October 先取,问她有没有必胜策略。

若她有必胜策略,输出一行 October wins!;否则输出一行 Roy wins!

输入格式

第一行一个正整数 T T T,表示测试点组数。

2 2 2 ∼ \sim T + 1 T+1 T+1 行,一行一个正整数 n n n,表示石子个数。

输出格式

T T T 行,每行分别为 October wins!Roy wins!

样例输入

3
4
9
14

样例输出

October wins!
October wins!
October wins!

提示

对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 30 1\leq n\leq 30 1n30

对于 60 % 60\% 60% 的数据, 1 ≤ n ≤ 1 0 6 1\leq n\leq 10^6 1n106

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 5 × 1 0 7 1\leq n\leq 5\times 10^7 1n5×107, 1 ≤ T ≤ 1 0 5 1\leq T\leq 10^5 1T105

(改编题)


思路

每次可以拿质数的自然数次方颗石子
对于6的倍数,一定不是质数的某一自然数次方
1,2,3,4,5都可以一次取到,
当n=6时,第一个人无论怎么取,后手赢

推至一般情况:
当n不是6的倍数,先手赢
当n是6的倍数,后手赢


题解代码:

python">t = int(input())
for _ in range(t):n = int(input())if n % 6 == 0:print("Roy wins!")else:print("October wins!")

总结


巴什博弈是一个相对简单的问题,但它引入了重要的概念,比如P态和N态的概念,对理解更复杂的组合博弈非常有用。
此外,如何通过数学公式快速得出结论也是解决此类问题的关键技巧之一。


如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢


http://www.ppmy.cn/ops/152744.html

相关文章

二叉树的所有路径(力扣257)

因为题目要求路径是从上到下的,所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外,此题还有一个难点就是如何求得所有路径。为了解决这个问题,我们需要用到回溯。回溯和递归不分家,每递归一…

java ,springboot 对接支付宝支付,实现生成付款二维码,退款,查询订单状态等接口

查看文档 支付宝文档地址&#xff1a; 小程序文档 - 支付宝文档中心 使用沙箱环境 沙箱登录地址 登录 - 支付宝 点击查看 才能看钥匙截图写错了。。 问号可以看默认加密方式 点击沙箱帐号 这里我们就具备所有条件了 实战开始 pom文件增加依赖 <dependency> <gro…

Spring Boot 自动配置

目录 什么是自动配置&#xff1f; Spring 加载 Bean ComponentScan Import 导入类 导入 ImportSelector 接口的实现类 SpringBoot 原理分析 EnableAutoConfiguration Import(AutoConfigurationImportSelector.class) AutoConfigurationPackage SpringBoot 自动配置流…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分&#xff0c;保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

Linux 网络:cBPF 简介

文章目录 1. 前言2. 什么是 cBPF&#xff1f;2.1 cBPF 工作原理2.2 cBPF 的使用2.3 实现细节2.3.1 挂接 BPF 指令到 sokcet2.3.2 执行 BPF 指令过滤数据包 3. cBPF 示例&#xff1a;过滤 EDSA 协议下的 PTP 以太网帧4. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能…

kotlin的协程的基础概念

Kotlin的协程是一种用于简化异步编程的强大工具。 理解协程的基础概念可以帮助开发者有效地利用其能力。 以下是Kotlin协程的一些关键基础概念&#xff1a; 协程&#xff08;Coroutines&#xff09; &#xff1a; 协程是一种用于处理并发任务的编程模型&#xff0c;它可以在单…

使用qwen作为基座训练分类大模型

训练大模型 import torch from transformers import AutoModelForSequenceClassification, AutoTokenizer, Trainer, TrainingArguments from datasets import load_dataset, DatasetDict# 1. 加载 Qwen2.5-0.5B 预训练模型和分词器 model_name "Qwen/Qwen2.5-0.5B"…

理解深度学习pytorch框架中的线性层

文章目录 1. 数学角度&#xff1a; y W x b \displaystyle y W\,x b yWxb示例 2. 编程实现角度&#xff1a; y x W T b \displaystyle y x\,W^T b yxWTb3. 常见错误与易混点解析4. 小结参考链接 在神经网络或机器学习的线性层&#xff08;Linear Layer / Fully Connect…