IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Acwing_891集合-Nim游戏【博弈论:sg函数】 -> 正文阅读

[游戏开发]Acwing_891集合-Nim游戏【博弈论:sg函数】

题目描述:

给定n堆石子以及一个由k个不同正整数构成的数字集合S。现在有两位玩家轮流操作,每次操作可以从任意一堆石子中拿取石子,每次拿取的石子数量必须包含于集合S,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数k,表示数字集合S中数字的个数。

第二行包含k个整数,其中第i个整数表示数字集合S中的第i个数si。

第三行包含整数n。

第四行包含n个整数,其中第i个整数表示第i堆石子的数量hi。

输出格式

如果先手方必胜,则输出“Yes”。否则,输出“No”。

数据范围

1≤n,k≤100,
1≤si,hi≤10000

输入样例:

2
2 5
3
2 4 7

输出样例:

Yes

思路分析:

本题与一般Nim游戏的不同之处在于每次拿走石子的个数必须是固定值,当不能继续操作时游戏结束。需要先引入一些概念。

公平组合游戏ICG: 若一个游戏满足:

  • 由两名玩家交替行动;
  • 在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;
  • 不能行动的玩家判负;

则称该游戏为一个公平组合游戏。
NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件2和条件3。

有向图游戏:给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。
Mex运算: 设S表示一个非负整数集合。定义mex(S)为求出不属于集合S的最小非负整数的运算,即:
mex(S) = min{x}, x属于自然数,且x不属于S
SG函数: 在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1, y2, …, yk,定义SG(x)为x的后继节点y1, y2, …, yk 的SG函数值构成的集合再执行mex(S)运算的结果,即:SG(x) = mex({SG(y1), SG(y2), …, SG(yk)})
特别地,整个有向图游戏G的SG函数值被定义为有向图游戏起点s的SG函数值,即SG(G) = SG(s)。

通过上面的定义可知,一般的Nim游戏,相当于对拿取石子不做限制,即每堆石子的状态可以转化为任意比原状态数量少的状态,而集合Nim则减少了有向图游戏的边数,只允许转移到特定的状态。对于Mex运算,Mex(S)表示的是不在S中最小的自然数,比如S = {0,1,2},则Mex(S)= 3。对于SG函数,用下面的图来阐述更为直观:
在这里插入图片描述
如果一堆中包含10个石子,每次只能拿2或5个,则所有拿石子的情况如图所示,所有终止状态由于不能到达任何其它状态,故其sg值为0,2可以到达0,其sg值为1,6可以到达4和1,而sg(4) = sg(1) = 0,故sg(6) = mex{0,0} = 1,以此类推可以得到上图蓝色字体标注的sg值。整个有向图的sg函数值就是起点10的sg函数值。可以发现,sg(x) != 0时,说明一定可以到达sg函数值为0的状态;sg(x)= 0时,说明一定到不了sg函数值为0的状态。回想下Nim游戏,任何异或和非0的状态一定可以直接转化为异或和为0的状态,任何异或和为0的状态都无法直接转化为异或和为0的状态。可见与有向图游戏如出一辙,如果只有一堆石子,先手面临的sg函数值非0,则可以转化为sg为0的状态,不论后手怎么操作,只要先手决策得当,最后面临必败态的一定是后手。

因此我们可以得出有向图游戏的定理:

  • 有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0。
  • 有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0。

本题涉及多个有向图游戏,给出以下概念:

设G1, G2, …, Gm 是m个有向图游戏。定义有向图游戏G,它的行动规则是任选某个有向图游戏Gi,并在Gi上行动一步。G被称为有向图游戏G1, G2, …, Gm的和。
有向图游戏的和的SG函数值等于它包含的各个子游戏SG函数值的异或和,即:
SG(G) = SG(G1) ^ SG(G2) ^ … ^ SG(Gm)

也就是说,只需要将每堆石子数目的sg函数值异或起来,如果非0,则先手必胜,否则必败。

证明与Nim游戏的证明类似: 设SG(G) = SG(G1) ^ SG(G2) ^ … ^ SG(Gm) = x != 0。则一定存在Gi,使得SG(Gi)的第k位也是1,其中k为x二进制表示中最高位的1的位置。故SG(Gi) ^ x < SG(Gi),由于SG(Gi)表示Gi不能到达的最小SG状态,故一定可以到达比SG(Gi)小的任何状态,自然可以到达SG(Gi) ^ x的状态,此时SG(G1) ^ SG(G2) ^ … ^ SG(Gm) ^x = x^x = 0,故异或和为非0的状态一定可以转化为异或和为0的状态。而后手面临的是异或和为0的状态,假设后手将Gi的状态改变为Gi’,使得异或和依然是0,则SG(G1) ^ SG(G2) ^ …^SG(Gi’) ^ …^SG(Gm) = 0,又SG(G1) ^ SG(G2) ^ …^SG(Gi) ^ …^SG(Gm) = 0,将两个等式左右两边分别异或得SG(Gi’) ^ SG(Gi) = 0,故SG(Gi’) = SG(Gi),又SG(Gi)表示Gi不能到达的SG最小的状态是SG(Gi),故SG(Gi’)不可能等于SG(Gi),假设不成立,故任何sg异或和为0的状态都无法转化为sg为0的状态。又最终的必败态是所有SG(Gi) = 0,此时异或和是0,故每堆石子数目的sg函数值异或起来非0,则先手必胜,问题得证。

最后的问题是如何计算SG函数值,可以使用记忆化搜索来做。

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_set>//不存储重复元素
using namespace std;
const int N = 110, M = 10010;
int n, m;
int s[N], f[M];
int sg(int x)
{
	if (f[x] != -1) return f[x];
	unordered_set<int> S;
	for (int i = 0; i < m; i++)
	{
		int sum = s[i];
		if (x >= sum) S.insert(sg(x - sum));
	}
	for (int i = 0;; i++) 
	{
		if (!S.count(i)) return f[x] = i;
	}
}

int main()
{
	cin >> m;
	for (int i = 0; i < m; i++) cin >> s[i];
	cin >> n;
	memset(f, -1, sizeof f);
	int res = 0;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		res ^= sg(x);
	}
	if (res) puts("Yes");
	else puts("No");
	system("pause");
	return 0;
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:16:13  更:2021-09-03 12:16:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/21 11:26:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码