博弈论(Nim游戏的扩展)

公平组合游戏ICG

若一个游戏满足:
1.由两名玩家交替行动;

2.在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;

3.不能行动的玩家判负;
则称该游戏为一个公平组合游戏。
NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏

必胜状态和必败状态

必胜状态,先手进行某一个操作,留给后手是一个必败状态时,对于先手来说是一个必胜状态。即先手可以走到某一个必败状态。
必败状态,先手无论如何操作,留给后手都是一个必胜状态时,对于先手来说是一个必败状态。即先手走不到任何一个必败状态。

  • 如果当前局面所有石堆的异或和(Nim和)为0,那么无论如何操作,当前玩家都处于必败态;如果当前局面是必败态,则无论如何操作,另一方总有必胜的策略。

  • 如果当前局面所有石堆的异或和(Nim和)不为0,那么当前玩家可以通过正确的策略使对手进入必败态,因此当前玩家处于必胜态。如果当前局面是必胜态,玩家可以通过正确操作将局面转化为必败态,从而保证胜利。

异或运算三个性质:
①任何数和 0做异或运算,结果仍然是原来的数
②任何数和其自身做异或运算,结果是 0
③异或运算满足交换律和结合律 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n; cin >> n;int res = 0;for(int i = 0; i < n; i++){int x; cin >> x;res^=x;}if(res) cout << "Yes\n";else cout <<"No\n";return 0;
}

台阶-Nim游戏

与经典Nim的区别

  • 在经典的Nim游戏中,石子堆是独立的,而在台阶-Nim中,台阶之间可能存在关联。例如,某个台阶上的石子数量可能会影响其他台阶的策略

 

 结论:

此时我们需要将奇数台阶看做一个经典的Nim游戏,如果先手时奇数台阶上的值的异或值为0,则先手必败,反之必胜。

证明:
先手时,如果奇数台阶异或非0,根据经典Nim游戏,先手总有一种方式使奇数台阶异或为0,于是先手留了奇数台阶异或为0的状态给后手,此时先手必赢。
于是轮到后手:
①当后手移动偶数台阶上的石子到奇数台阶上时,先手只需将对手移动的石子继续移到下一个台阶,这样奇数台阶的石子相当于没变,奇数异或和仍是非0于是留给后手的又是奇数台阶异或为0的状态
②当后手移动奇数台阶上的石子到偶数台阶上时,留给先手的奇数台阶异或非0,根据经典Nim游戏,先手总能找出一种方案使奇数台阶异或为0

因此无论后手如何移动,先手总能通过操作把奇数异或为0的情况留给后手,当奇数台阶全为0时,只留下偶数台阶上有石子。

因此如果先手时奇数台阶上的值的异或值为非0,则先手必胜,反之必败!

#include <bits/stdc++.h>
using namespace std;
using ll = long long;int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n; cin >> n;int res = 0;for(int i = 1; i <= n; i++){int x; cin >> x;if(i & 1)res^=x;}if(res) cout << "Yes\n";else cout <<"No\n";return 0;
}

 集合-Nim游戏:

1.Mex运算:
设S表示一个非负整数集合.定义mex(S)为求出不属于集合S的最小非负整数运算
例如:S={0,1,2,4},那么mes(S)=3;

2.SG函数

  • 对于一个游戏状态 x,SG函数值 SG(x)表示从该状态出发,所有可能的后续状态的SG值所能达到的“最小非负整数”(Mex)。
  • 具体来说,若从状态 x通过合法操作可以到达的所有状态的SG值分别为 SG(y1),SG(y2),.......,SG(yk)那么 SG(x)就是一个不在这些SG值集合中的最小非负整数。

SG函数的性质:类似于经典的Nim游戏

  • 必败态(Losing Position):对于某个状态 x,如果 SG(x)=0那么当前处于该状态的玩家将无法避免失败(即在对方采取最优策略的情况下无论如何都会输)。
  • 必胜态(Winning Position):对于某个状态 x,如果 SG(x)\,\, \, !=\, \, \, 0,那么当前处于该状态的玩家有策略可以使对手进入必败态。也就是先手一定会胜利。

递归计算:

例如s = [2,5],x = 10时递归得到

 

初始状态:
  • f[x] 是用来存储每个x的SG值的数组,初始时f[x]的所有值都被设置为-1(表示尚未计算过)。
  • x = 10 是我们要计算的状态,s = [2, 5] 是可供选择的石子数。
计算 sg(10) 的过程:
  1. 调用 sg(10)

    • 首先检查 f[10],因为f[10] = -1,说明还没有计算过,所以继续计算。
    • 初始化集合 S
  2. 遍历 s[i]

    • s[0] = 2
      • 因为 10 >= 2,所以我们递归调用 sg(10 - 2) = sg(8)
    • s[1] = 5
      • 因为 10 >= 5,所以我们递归调用 sg(10 - 5) = sg(5)
  3. 递归调用 sg(8)

    • 首先检查 f[8],因为f[8] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 8 >= 2,所以我们递归调用 sg(8 - 2) = sg(6)
      • s[1] = 5
        • 因为 8 >= 5,所以我们递归调用 sg(8 - 5) = sg(3)
  4. 递归调用 sg(6)

    • 首先检查 f[6],因为f[6] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 6 >= 2,所以我们递归调用 sg(6 - 2) = sg(4)
      • s[1] = 5
        • 因为 6 >= 5,所以我们递归调用 sg(6 - 5) = sg(1)
  5. 递归调用 sg(4)

    • 首先检查 f[4],因为f[4] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 4 >= 2,所以我们递归调用 sg(4 - 2) = sg(2)
      • s[1] = 5
        • 因为 4 < 5,所以跳过。
  6. 递归调用 sg(2)

    • 首先检查 f[2],因为f[2] = -1,所以继续计算。
    • 初始化集合 S
    • 遍历 s[i]
      • s[0] = 2
        • 因为 2 >= 2,所以我们递归调用 sg(2 - 2) = sg(0)
      • s[1] = 5
        • 因为 2 < 5,所以跳过。
  7. 递归调用 sg(0)

    • sg(0)是一个基本情况,因为没有石子可以取走,故f[0] = 0,返回 0
  8. 接下来如上继续.....
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 110, M = 10010;
int n,m;
int s[N],f[M];//s存储的是可供选择的石子数, f存储的是所有可能情况的SG值
int sg(int x){if(f[x] != -1) return f[x]; // 如果x的SG值已经计算过,直接返回set<int> S;//S是一个有序集合,用来存储当前状态的所有可能的下一步的SG值// 循环每一次可以选择拿走的石头数for(int i = 0; i < m; i++){// 递归计算x减去s[i]后的状态的SG值,并插入到集合S中if(x >= s[i]) S.insert(sg(x - s[i]));}//找到不存在的最小自然数for(int i = 0; ; i++){if(!S.count(i)) return f[x] = i;}
}int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> m;for(int i = 0; i < m; i++) cin >> s[i];cin >> n;memset(f,-1,sizeof f);f[0] = 0; //当x为0的时候sg函数返回0// 类似于经典的Nim游戏int res = 0;while(n--){int x; cin >> x;res ^= sg(x);}if(res) cout << "Yes\n";else cout <<"No\n";return 0;
}

拆分-Nim游戏

相比于集合-Nim,这里的每一堆可以变成小于原来那堆的任意大小的两堆 

即a[i]可以拆分成(b[i],b[j]),为了避免重复规定b[i]>=b[j]即:a[i]>b[i]>=b[j]

相当于一个局面拆分成了两个局面,由SG函数理论,多个独立局面的SG值,等于这些局面SG值的异或和。SG(i^j) = SG(i) ^SG(j)

因此需要存储的状态就是sg(b[i])^sg(b[j]),与集合-Nim的唯一区别

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 110, M = 10010;
int n,m;
int s[N],f[M];//s存储的是可供选择的石子数, f存储的是所有可能情况的SG值
int sg(int x){if(f[x] != -1) return f[x]; // 如果x的SG值已经计算过,直接返回set<int> S;//这里可以改为unordered_set<int> S//S是一个有序集合,用来存储当前状态的所有可能的下一步的SG值for(int i = 0; i < x; i++){for(int j = 0; j <= i; j++){S.insert(sg(i) ^ sg(j));}}//找到不存在的最小自然数for(int i = 0; ; i++){if(!S.count(i)) return f[x] = i;}
}int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> n;memset(f,-1,sizeof f);f[0] = 0;// 类似于经典的Nim游戏int res = 0;while(n--){int x; cin >> x;res ^= sg(x);}if(res) puts("Yes");else puts("No");return 0;
}

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

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

相关文章

大刀阔斧改革之后,阅文距离“东方迪士尼”更近了吗?

当前&#xff0c;网文IP的确是“富矿”。中国社会科学院文学研究所发布的《2023中国网络文学发展研究报告》显示&#xff0c;截至2023年底&#xff0c;网络文学IP市场规模2605亿元&#xff0c;同比增长近百亿元。 近日&#xff0c;网文产业中的头部企业阅文集团也披露数据称&a…

虚拟内存和linux(操作系统part1)

一个操作系统的虚拟内存和linux部分知识点的笔记整理&#xff0c;资料大多参考于&#xff1a;小林coding和Javaguide。 虚拟内存的作用 第一&#xff0c;虚拟内存可以使得进程运行内存超过物理内存大小&#xff0c;因为程序运行符合局部性原理&#xff0c;CPU 访问内存会有很…

【iOS安全】iPhone8 iOS14.4.2 越狱教程

环境配置 iPhone 8&#xff1a; 固件版本 iOS 14.4.2 (18D70) 产品类型 iPhone10,1 (A1906) 销售型号 MQ862J/A MacBook Pro&#xff1a; macOS 10.15.7 装有CheckRa1n beta 0.12.4 概述 尝试了几个版本的unc0ver和Taurine&#xff0c;发现都不好使 unc0ver显示unsupported…

Spring Cloud Eureka与Kubernetes的集成:服务发现的混合方案

Spring Cloud Eureka与Kubernetes的集成&#xff1a;服务发现的混合方案 引言 随着微服务架构的流行&#xff0c;服务发现&#xff08;Service Discovery&#xff09;已经成为构建分布式系统的关键组件之一。在分布式系统中&#xff0c;服务实例的数量和位置是动态变化的&…

95.SAP MII功能详解(08)Workbench-Transaction介绍

目录 1.Transaction 2.Properties of transaction 1.Transaction You use transactions to access data from multiple sources and execute processes, which are triggered synchronously or asynchronously.您可以使用事务从多个源访问数据并执行同步或异步触发的流程。…

React Hooks 的使用场景有哪些?

React Hooks是React 16.8引入的一项特性&#xff0c;它允许你在不编写类组件的情况下使用state和其他React特性。以下是React Hooks的一些主要使用场景&#xff1a; 状态管理&#xff1a;使用useState Hook在函数组件中添加本地状态。 副作用处理&#xff1a;使用useEffect Ho…

代码随想录——两个字符串的删除操作(Leetcode 583)

题目链接 动态规划 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 确定递推公式 当…

第 4 章 ECMASript 8 新特性

4.1 async 和 await async 和 await 两种语法结合可以让异步代码像同步代码一样 4.1.1 async 函数 async 函数的返回值为 promise 对象&#xff0c;promise 对象的结果由 async 函数执行的返回值决定 如果返回的是一个成功的Promise&#xff0c;result的结果就是一个成功的…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议&#xff0c;实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求&#xff0c;要求提供不同的电压和电流&#xff0c;充电器接收到请求后&#xff0c;会根据设备的…

算法训练营|图论第一天 98. 所有可达路径

题目&#xff1a;所有可到达路径 题目链接&#xff1a; 98. 所有可达路径 (kamacoder.com) 解题思路&#xff1a; 邻接矩阵&#xff0c;注意没有result -1时候特判 #include<bits/stdc.h> using namespace std; vector<vector<int>>result; vector<…

cordova手动更新

1&#xff1a;依赖 cordova-plugin-file cordova-plugin-file-transfer cordova-plugin-file-opener2 第二个参数&#xff1a;application/vnd.android.package-archive来源 cordova plugin add cordova-plugin-app-version//获取cordova版本号 cordova plugin add cordova-p…

Python | Leetcode Python题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; class Solution:def getMoneyAmount(self, n: int) -> int:f [[0] * (n 1) for _ in range(n 1)]for i in range(n - 1, 0, -1):for j in range(i 1, n 1):f[i][j] j f[i][j - 1]for k in range (i, j):f[i][j] min(f[i][j], k …

视频中间件:大华视频设备接入管理应用

前言 上篇博文介绍了视频中间件&#xff1a;海康视频设备的接入管理&#xff1f;&#xff0c;今天给大家带来大华视频设备的接入管理&#xff0c;视频中间件平台支持大华Sdk、大华主动注册、Onvif、Rtsp、Gb28181等方式对大华视频设备的接入管理。同时视频中间件可支持协议互转…

Quarkus 后端开发记录

最近业余在开发一款智能助理产品&#xff0c;记录开发过程中的一些问题以备忘&#xff0c;也是帮其他人防坑。 主要技术栈 Quarkus: the Supersonic Subatomic Java Framework.RESTEasy Reactive: 实现 RESTful 接口 (JAX-RS)Hibernate Reactive: 是 Hibernate ORM 的响应式 …

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!

虚幻引擎&#xff08;Unreal Engine&#xff09;火了黑神话游戏。 往后&#xff0c;会有大批量的公司开始模仿这个赛道&#xff01; C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎&#xff0c;如虚幻引擎&#xff08;Unreal Engine&#xff09;等。以下是对 C 虚拟引…

【HarmonyOS 4.0】全局UI方法

1. 弹窗 1.1 Toast - 消息提示 常用于显示一些简短的消息或提示&#xff0c;一般会在短暂停留后自动消失。 import promptAction from ohos.promptActionpromptAction.showToast(options: {message: string | Resource, duration: number, bottom: string | number}): void1.2…

数据库应用

一、数据库基本概念 1、数据 &#xff08;1&#xff09;描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 &#xff08;2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels3, out_channels 64, kernel_size3, stride1, padding0, biasFalse) in_channels in_channels 可以设置成1&#xff0c;2&#xff0c;3&#xff0c;4等等都可以&#xff0c;一般来说做图像识别的时…

SD-WAN组网部署需要多久?

企业在发展时&#xff0c;对能够快速响应需求、降低成本、提升网络性能与安全性的解决方案的需求日益迫切。SD-WAN作为一种创新的网络技术&#xff0c;正逐渐成为企业实现这一目标的关键工具。许多企业关心的问题是&#xff1a;部署SD-WAN需要多长时间&#xff1f;接下来我们将…

舍得酒业增长梦魇浮现:上半年业绩下挫,库存激增仍要扩产

撰稿|行星 来源|贝多财经 2024年&#xff0c;白酒行业仍处于“存量竞争”下的调整恢复期。而据中国酒业协会理事长宋书玉透露&#xff0c;今年上半年全国白酒产量、销售收入、利润分别同比增长3%、11%和15%&#xff0c;实现量、价、利齐升&#xff0c;展现出强大的韧性。 在市…