蓝桥杯C语言组:博弈问题


概述

在编程的世界里,博弈问题就像是一场智力的“斗地主”,双方(或者多方)使出浑身解数,只为赢得最后的胜利。而蓝桥杯C语言比赛中的博弈问题,更是让无数参赛者又爱又恨的存在。它们就像是隐藏在代码森林中的宝藏,只有最聪明、最勇敢的“探险家”才能找到通往胜利的道路。今天,就让我们一起踏上这场充满挑战与惊喜的博弈之旅,看看那些看似高不可攀的博弈问题,其实也可以被我们轻松拿下!


一、博弈问题的基础知识

博弈问题通常涉及两个或多个参与者,在一定的规则下,各自采取行动以实现自己的目标。在编程竞赛中,常见的博弈问题有Nim博弈巴什博弈威佐夫博弈等。这些博弈问题都有其独特的性质和解题方法,掌握它们的基本原理是解题的关键。

(一)Nim博弈

定义:假设有若干堆物品,每堆有若干个物品,两个玩家轮流从某一堆中取走任意数量的物品(至少取一个),最后取走最后一个物品的玩家获胜。Nim博弈的胜负可以通过计算所有堆的物品数量的异或值来判断。如果异或值为0,则先手必败;否则,先手必胜。

表格分析: 假设初始状态有三堆石子,数量分别为abc,如下表所示:

堆数石子数量异或值
1aa
2ba ⊕ b
3ca ⊕ b ⊕ c

胜负判断

  • 如果a ⊕ b ⊕ c == 0,则先手必败。

  • 否则,先手必胜。

(二)巴什博弈

定义:假设有n个物品,每次可以取1m个物品,最后取走最后一个物品的人获胜。巴什博弈的胜负可以通过计算n除以m+1的余数来判断。如果余数为0,则先手必败;否则,先手必胜。

表格分析: 假设m=3,即每次可以取13个物品,如下表所示:

物品总数nn % (m+1)胜负情况
11先手胜
22先手胜
33先手胜
40先手败
51先手胜
62先手胜
73先手胜
80先手败

从表格中可以看出,当n % (m+1) == 0时,先手必败;否则,先手必胜。

(三)威佐夫博弈

定义:假设有两堆物品,每次可以从一堆中取任意数量的物品,或者从两堆中取相同数量的物品。最后取走最后一个物品的人获胜。威佐夫博弈的胜负可以通过计算两堆物品数量的差值和较小堆的数量的比值来判断。如果比值等于黄金分割比(约1.618),则先手必败;否则,先手必胜。

表格分析: 假设两堆物品的数量分别为ab,且a < b,如下表所示:

堆1数量a堆2数量b差值b - a比值(b - a) / a胜负情况
1211.000先手胜
1322.000先手胜
2310.500先手胜
2531.500先手胜
3520.667先手胜
3851.667先手胜
5830.600先手胜
51381.600先手胜
81350.625先手胜
821131.625先手胜

从表格中可以看出,当(b - a) / a接近黄金分割比1.618时,先手必败;否则,先手必胜。


二、蓝桥杯中的博弈问题实例分析

在蓝桥杯比赛中,博弈问题常常以各种巧妙的形式出现,考验参赛者的逻辑思维和编程能力。以下是一些经典的蓝桥杯博弈问题实例。

(一)取球博弈问题

题目描述:两个人玩取球的游戏。一共有N个球,每人轮流取球,每次可取集合{n1, n2, n3}中的任何一个数目。如果无法继续取球,则游戏结束。此时,持有奇数个球的一方获胜。如果两人都是奇数,则为平局。假设双方都采用最聪明的取法,第一个取球的人一定能赢吗?

解题思路

  1. 状态分析:我们需要分析在每一轮取球后,双方持有的球数情况。由于每次取球的数目是固定的,因此可以通过模拟每一轮的取球过程来分析。

  2. 胜负判断:根据题目规则,持有奇数个球的一方获胜。因此,我们需要判断在每一轮取球后,双方持有的球数是否为奇数。

  3. 策略选择:假设双方都采用最聪明的取法,那么我们需要分析在每一轮取球时,先手和后手分别有哪些策略可以选择,以及这些策略对胜负的影响。

表格分析: 假设n1=1n2=2n3=3,初始球数分别为5791113

初始球数先手取球策略后手取球策略先手球数后手球数胜负情况
5取1取212先手胜
7取2取121先手胜
9取3取131先手胜
11取1取212先手胜
13取2取121先手胜

从表格中可以看出,在这种情况下,先手总是能够获胜。这是因为先手可以通过合理的取球策略,始终保持自己持有的球数为奇数,从而最终获胜。

代码实现

#include <stdio.h>int main() {int N, n1, n2, n3;scanf("%d %d %d %d", &N, &n1, &n2, &n3);int first = 0, second = 0;while (N > 0) {if (N >= n1) {first += n1;N -= n1;} else if (N >= n2) {first += n2;N -= n2;} else if (N >= n3) {first += n3;N -= n3;} else {break;}if (N >= n1) {second += n1;N -= n1;} else if (N >= n2) {second += n2;N -= n2;} else if (N >= n3) {second += n3;N -= n3;} else {break;}}if (first % 2 == 1) {printf("First wins\n");} else if (second % 2 == 1) {printf("Second wins\n");} else {printf("Draw\n");}return 0;
}

(二)Nim博弈问题

题目描述:有若干堆石子,每堆有若干个石子。两个玩家轮流从某一堆中取走任意数量的石子(至少取一个),最后取走最后一个石子的玩家获胜。

解题思路

  1. 异或运算:计算所有堆的石子数量的异或值。如果异或值为0,则先手必败;否则,先手必胜。

  2. 策略选择:如果先手必胜,那么先手需要找到一个合适的堆,从中取走一定数量的石子,使得剩下的石子数量的异或值为0。这样,无论后手如何取石子,先手都可以通过调整自己的取石子策略,始终保持异或值为0,从而最终获胜。

表格分析: 假设初始状态有三堆石子,数量分别为345

堆数石子数量异或值
133
247
352

异或值为2,因此先手必胜。

代码实现

#include <stdio.h>int main() {int n;scanf("%d", &n); // 输入堆数int xor_sum = 0;for (int i = 0; i < n; i++) {int stones;scanf("%d", &stones); // 输入每堆的石子数量xor_sum ^= stones; // 计算异或值}if (xor_sum == 0) {printf("Second\n"); // 先手必败} else {printf("First\n"); // 先手必胜}return 0;
}

(三)巴什博弈问题

题目描述:有n个物品,每次可以取1m个物品,最后取走最后一个物品的人获胜。

解题思路

  1. 余数判断:计算n除以m+1的余数。如果余数为0,则先手必败;否则,先手必胜。

  2. 策略选择:如果先手必胜,那么先手需要在第一轮取走n % (m+1)个物品,这样剩下的物品数量就是m+1的倍数。无论后手如何取物品,先手都可以通过调整自己的取物品策略,始终保持剩下的物品数量为m+1的倍数,从而最终获胜。

表格分析: 假设m=3,即每次可以取13个物品,如下表所示:

物品总数nn % (m+1)胜负情况
11先手胜
22先手胜
33先手胜
40先手败
51先手胜
62先手胜
73先手胜
80先手败

从表格中可以看出,当n % (m+1) == 0时,先手必败;否则,先手必胜。

代码实现

#include <stdio.h>int main() {int n, m;scanf("%d %d", &n, &m); // 输入物品数量和每次可取的最大数量if (n % (m + 1) == 0) {printf("Second\n"); // 先手必败} else {printf("First\n"); // 先手必胜}return 0;
}

三、博弈问题的解题技巧与策略

在解决博弈问题时,除了掌握基本的博弈原理外,还需要运用一些解题技巧和策略,以提高解题效率和准确性。

(一)模拟法

对于一些简单的博弈问题,可以通过模拟每一轮的操作过程,分析双方的策略和胜负情况。这种方法虽然简单,但在某些情况下可能会比较繁琐,尤其是当博弈的轮数较多时。

例题: 假设两个人轮流从一堆石子中取石子,每次可以取13个石子,最后取走最后一个石子的人获胜。初始有10个石子,先手是否必胜?

解题思路

  1. 模拟过程:从初始状态开始,模拟每一轮的操作过程。

  2. 胜负判断:根据模拟结果判断胜负情况。

表格分析: 假设初始有10个石子,先手和后手轮流取石子,如下表所示:

轮次先手取石子数后手取石子数剩余石子数
1136
2312
3110

从表格中可以看出,先手在第三轮取走最后一个石子,因此先手必胜。

(二)数学归纳法

对于一些具有规律性的博弈问题,可以尝试使用数学归纳法来寻找解题规律。通过分析前几轮的操作过程,归纳出一般性的结论,从而快速判断胜负情况。

例题: 假设两个人轮流从一堆石子中取石子,每次可以取13个石子,最后取走最后一个石子的人获胜。初始有n个石子,先手是否必胜?

解题思路

  1. 分析规律:通过分析前几轮的操作过程,归纳出一般性的结论。

  2. 胜负判断:根据归纳出的规律判断胜负情况。

表格分析: 假设每次可以取13个石子,如下表所示:

物品总数nn % (m+1)胜负情况
11先手胜
22先手胜
33先手胜
40先手败
51先手胜
62先手胜
73先手胜
80先手败

从表格中可以看出,当n % (m+1) == 0时,先手必败;否则,先手必胜。

(三)逆向思维

在某些博弈问题中,从后往前分析可能会更加简单。例如,在Nim博弈中,我们可以从最后一步开始分析,逐步向前推导,找到先手获胜的策略。

例题: 假设两个人轮流从一堆石子中取石子,每次可以取13个石子,最后取走最后一个石子的人获胜。初始有n个石子,先手是否必胜?

解题思路

  1. 逆向分析:从最后一步开始分析,逐步向前推导。

  2. 胜负判断:根据逆向分析的结果判断胜负情况。

表格分析: 假设每次可以取13个石子,如下表所示:

物品总数nn % (m+1)胜负情况
11先手胜
22先手胜
33先手胜
40先手败
51先手胜
62先手胜
73先手胜
80先手败

从表格中可以看出,当n % (m+1) == 0时,先手必败;否则,先手必胜。


四、博弈问题的拓展与应用

博弈问题不仅在编程竞赛中有着广泛的应用,还在实际生活中也随处可见。例如,在经济领域中的市场竞争、在体育比赛中的战术选择、在人际关系中的合作与竞争等,都可以用博弈理论来分析和解释。通过学习博弈问题,我们可以培养自己的逻辑思维能力和决策能力,更好地应对各种复杂的情况。

(一)实际应用案例

案例1:市场竞争中的博弈 假设两家公司A和B在同一个市场中竞争。每家公司可以选择高价或低价销售产品。如果两家公司都选择高价,每家公司可以获得100万元的利润;如果一家公司选择高价,另一家公司选择低价,选择低价的公司可以获得150万元的利润,而选择高价的公司只能获得50万元的利润;如果两家公司都选择低价,每家公司可以获得80万元的利润。

解题思路

  1. 构建收益矩阵:根据题目描述构建收益矩阵。

  2. 分析策略:分析每家公司的策略选择及其对收益的影响。

收益矩阵

公司A\公司B高价低价
高价100, 10050, 150
低价150, 5080, 80

从收益矩阵中可以看出,如果两家公司都选择低价,每家公司可以获得80万元的利润,这是纳什均衡点。因此,两家公司都会选择低价销售产品。

案例2:体育比赛中的博弈 假设两名运动员A和B在比赛中竞争。每名运动员可以选择进攻或防守。如果两名运动员都选择进攻,A的胜率为60%,B的胜率为40%;如果A选择进攻,B选择防守,A的胜率为80%,B的胜率为20%;如果A选择防守,B选择进攻,A的胜率为30%,B的胜率为70%;如果两名运动员都选择防守,A的胜率为50%,B的胜率为50%

解题思路

  1. 构建胜率矩阵:根据题目描述构建胜率矩阵。

  2. 分析策略:分析每名运动员的策略选择及其对胜率的影响。

胜率矩阵

运动员A\运动员B进攻防守
进攻60%, 40%80%, 20%
防守30%, 70%50%, 50%

从胜率矩阵中可以看出,如果A选择进攻,B选择防守,A的胜率最高,为80%。因此,A会选择进攻,B会选择防守。


五、总结与展望

通过以上对蓝桥杯C语言中的博弈问题的分析和探讨,我们可以发现,博弈问题虽然看似复杂,但只要掌握了正确的解题方法和技巧,就能够轻松应对。在未来的编程竞赛中,博弈问题可能会以更加复杂的形式出现,这就需要我们不断地学习和探索,提高自己的解题能力。同时,我们也可以将博弈理论应用到实际生活中,帮助我们更好地做出决策,取得成功。

在学习博弈问题的过程中,我们不仅能够锻炼自己的思维能力,还能感受到编程的乐趣和挑战。希望这篇论文能够帮助你在蓝桥杯比赛中取得好成绩,同时也希望你在编程的道路上越走越远,创造出更多精彩的代码作品!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15637.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BS架构(笔记整理)

楔子.基本概念 1.在网络架构中&#xff1a; 服务器通常是集中式计算资源&#xff0c;负责处理和存储数据&#xff1b;客户机是请求这些服务的终端设备&#xff0c;可能是个人电脑或移动设备&#xff1b;浏览器则是客户机上用来与服务器交互的工具&#xff0c;负责展示网页内容…

【动态规划篇】:动态规划解决路径难题--思路,技巧与实例

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;动态规划篇–CSDN博客 文章目录 一.动态规划中的路径问题1.核心思路2.注意事项 二.例题讲解…

【Linux】深入理解linux权限

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …

嵌入式linux系统中VIM编辑工具用法与GCC参数详解

大家好,今天主要给大家分享一下,如何使用linux系统中的VIM编辑工具和GCC的参数详解。 第一:安装VIM 命令:sudo apt get install vim 第二:工作模式 普通模式:打开一个文件时的默认模式,按ESC返回普通模式 插入模式:i/o/a进入插入模式,不同在于在光标前后插入 可视…

【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解

前言 &#x1f31f;&#x1f31f;本期讲解关于HTMLCSSJavaScript的基础知识&#xff0c;小编带领大家简单过一遍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 …

蓝桥杯---数青蛙(leetcode第1419题)

文章目录 1.题目重述2.例子分析3.思路分析4.思路总结5.代码解释 1.题目重述 这个题目算是模拟这个专题里面的一类比较难的题目了&#xff0c;他主要是使用crock这个单词作为一个整体&#xff0c;让我们确定&#xff1a;给你一个字符串&#xff0c;至少需要多少个青蛙进行完成鸣…

WidowX-250s 机械臂学习记录

官网教程&#xff1a;Python Demos — Interbotix X-Series Arms Documentation 系统&#xff1a;Ubuntu20.04&#xff0c;ROS1 相关的硬件编译配置跳过 Python Demos 这些演示展示了使用 Interbotix Python Arm 模块的各种方法&#xff08;点击链接查看完整的代码文档&…

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介&#xff1a; 学习资料&#xff1a; 跳转目录&#xff1a; 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…

集成右键的好用软件,支持多线程操作!

今天给大家分享一个超级实用的小工具&#xff0c;真的能帮上大忙呢&#xff01;这个软件是吾爱大神无知灰灰精心制作的&#xff0c;简直就是图片转换界的“小能手”。 它能一键把webp格式的图片转换成png格式&#xff0c;而且速度超快&#xff0c;完全不输那些付费的软件&#…

CSDN 博客之星 2024:肖哥弹架构的社区耕耘总结

#博客之星2024年度总评选—主题文章创作# CSDN 博客之星 2024&#xff1a;肖哥弹架构的社区耕耘总结 肖哥弹架构 是一位专注于技术分享和社区建设的博客作者。今年&#xff0c;我荣幸地再次入选CSDN博客之星TOP300&#xff0c;这不仅是对我过去努力的认可&#xff0c;更是对未…

【分布式理论7】分布式调用之:服务间的(RPC)远程调用

文章目录 一、RPC 调用过程二、RPC 动态代理&#xff1a;屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC序列化与协议编码1. RPC 序列化2. RPC 协议编码2.1. 协议编码的作用2.2. RPC 协议消息组成 四、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC…

综合评价 | 基于随机变异系数-TOPSIS组合法的综合评价模型(Matlab)

基于随机变异系数-TOPSIS组合法的综合评价模型 代码获取私信回复&#xff1a;综合评价 | 基于随机变异系数-TOPSIS组合法的综合评价模型&#xff08;Matlab&#xff09; 一、引言 1.1、研究背景与意义 在现代社会&#xff0c;随着信息量的不断增加和数据复杂性的提升&#…

采用分步式无线控制架构实现水池液位自动化管理

以下是基于巨控GRM241Q-4D4I4QHE模块的完整技术方案&#xff0c;采用分步式无线控制架构实现水池液位自动化管理&#xff1a; 一、系统架构设计 硬件部署 山顶单元 GRM241Q模块&#xff08;带4G功能&#xff09; 液位计&#xff08;4-20mA&#xff09; 功能&#xff1a;实时采…

Vue设计模式到底多少种?

Vue设计模式到底多少种&#xff1f; 很多同学问&#xff0c;Vue到底有多少种设计模式&#xff1f;&#xff1f;各个模式到底是什么意思&#xff1f;&#xff1f;又各自适合什么场景&#xff1f;&#xff1f; 这里我给大家直接说下&#xff0c;Vue的设计模式没有一个固定的数值…

[LeetCode] day19 454. 四数相加 II

题目链接 题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&…

查看二进制程序内的 .interp 段

synopsis 可以使用 readelf &#xff0c;objdump&#xff0c;hexdump等工具查看 二进制程序内的.interp段信息。 1. 使用readelf查看.interp段 readelf 是一个查看ELF&#xff08;Executable and Linkable Format&#xff09;文件信息的工具&#xff0c;特别适合查看ELF头和…

【时时三省】(C语言基础)基础习题1

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 1.什么是程序&#xff1f;什么是程序设计 程序是为实现特定目标或解决特定问题&#xff0c;用计算机能理解和执行的语言编写的一系列指令的集合。 程序设计是问题分析&#xff0c;设计算法…

食品饮料生产瓶颈?富唯智能协作机器人来 “破壁”

在食品和饮料行业的发展进程中&#xff0c;诸多生产瓶颈如重复性劳动负担、复杂环境作业难题、季节性产能波动等&#xff0c;长期制约着企业的高效运营与进一步发展。如今&#xff0c;富唯智能协作机器人的出现&#xff0c;为这些难题提供了完美的解决方案&#xff0c;正逐步改…

[创业之路-289]:《产品开发管理-方法.流程.工具 》-15- 需求管理 - 第1步:原始需求收集

概述&#xff1a; 需求收集是需求管理的第一步&#xff0c;也是产品开发、项目管理或软件设计中的关键步骤。原始需求收集主要是指从各种来源获取关于产品或服务的初步需求和期望。 以下是对需求管理中的原始需求收集的详细分析&#xff1a; 1、原始需求收集的目的 原始需求…

81页精品PPT | 华为流程与信息化实践与架构规划分享

华为流程与信息化实践与架构规划分享主要围绕华为在业务流程与信息化建设方面的经验、企业架构规划方法以及企业数字化转型路径展开。华为通过持续的业务变革和信息化建设&#xff0c;从本土企业逐步发展为国际化、全球化企业&#xff0c;其管理体系以持续创新和世界级管理体系…