首页 > 其他分享 >Nim 游戏 和 有向图游戏

Nim 游戏 和 有向图游戏

时间:2024-09-29 16:03:46浏览次数:6  
标签:状态 有向图 游戏 Nim 后继 必胜 oplus

Nim

经典的博弈论
大致意思:地上有 n 堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。问是否存在先手必胜的策略。
乍一看手玩一下,发现很复杂,于是考虑把游戏状态形式化地表示出来便于观察。
设先手为a,后手为b。先手必胜其实就是后手必败,那么我们只需考虑什么时候后手会赢。
考虑在最优策略下游戏的结局是一定的,所以其实后手会赢就是后手必胜。
我们把所有石子的当前数目记录下来设为一个状态,例如我现在有三堆石子,分别是5,3,6个,则5,3,6就是当前状态,如果我从第三堆拿一个,就变成了5,3,5个,我们就称5,3,5是5,3,6的后继状态。
你考虑如果一个状态没有后继则是必败的。而一个状态的所有后继都必胜,那么这个状态必败(注意这里一步以后玩家变了,所以对手必败那我必胜),如果一个状态有一个后继必败,那么这个状态就是必胜的。所以其实构成了一张图,我们称之为博弈图。
一般情况下,博弈图会是DAG,在博弈图上建边跑topo可以判断。然而有没有更简便的方式呢?
直接上结论吧:
如果所有石子的异或和为0则必败,否则必胜。
这是怎么回事呢?
我们证明一下:
显然对于这个结论,只需要证明上面我们说过的三条性质。对于第一条性质,如果一个状态没有后继,那么这个状态一定是全0的,异或起来也都是0。第二条,所有后继都必胜,说明异或和都不为0,那么一定有一位是不一样的。我现在这个状态是我后继状态某一堆石子加一,那么一定会存在一种操作可以使得我当前状态全0变成后继状态。
形式化地说:
对于某个局面 \((a1,a2,...,an)\) ,若 \(a_1 \oplus a_2 \ \oplus...\oplus \ a_n \ !=0\) ,一定存在某个合法的移动,将 \(a_i\) 改变成 \(a_i'\) 后满足\(a_1\oplus a_2\oplus ...\oplus \ a_i' \ \oplus...\oplus a_n=0\)。不妨设 \(a_1 \oplus a_2 \ \oplus ...\oplus a_n=k\) ,则一定存在某个 \(a_i\) ,它的二进制表示在 \(k\) 的最高位上是1。这时 \(a_i \oplus k<a_i\) 一定成立(减去了k)。则我们可以将 \(a_i\) 改变成 \(a_i'=a_i\oplus k\),此时\(a_1\oplus a_2\oplus...\oplus \ a_i' \ \oplus...\oplus \ a_n=a_1\oplus a_2 \ \oplus...\oplus \ a_n\oplus \ k=0\)。
第三条差不多同理。
证毕。
所以我们现在再来看异或的作用,异或不为0,就是保留一个k,保留一个位数,保留一个数,可以取出,可以向下一步转移,对于必胜和必败都可以做出相应转换,因此可以到达末状态,这是至关重要的。

模板:

P2197 【模板】Nim 游戏

#include<bits/stdc++.h>
using namespace std;
int T,n,num[10005],temp;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;++i) scanf("%d",&num[i]);
		temp=0;
		for(int i=1;i<=n;++i) temp^=num[i];
		if(temp) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

P4279 [SHOI2008] 小约翰的游戏
反Nim,注意特判一下全为1的情况。

#include<bits/stdc++.h>
using namespace std;
int T,n,num[55],temp,flag;
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		flag=0;
		for(int i=1;i<=n;++i){
			scanf("%d",&num[i]);
			if(num[i]!=1) flag=1;
		}
		if(!flag){
			if(n&1) printf("Brother\n");
			else printf("John\n");
		}
		else{
			temp=0;
			for(int i=1;i<=n;++i) temp^=num[i];
			if(temp) printf("John\n");
			else printf("Brother\n");
		}
	}
	return 0;
}

有向图游戏

有向图游戏是一个经典的博弈游戏——实际上,大部分的公平组合游戏都可以转换为有向图游戏。
在一个有向无环图中,只有一个起点,上面有一个棋子,两个玩家轮流沿着有向边推动棋子,不能走的玩家判负。——OI-WIKI

这一部分直接看OI-WIKI吧,讲得很清楚 有向图游戏与SG定理

Nim游戏具体策略看第一个参考文献

有向图游戏的各种类型看第二个

标签:状态,有向图,游戏,Nim,后继,必胜,oplus
From: https://www.cnblogs.com/mountzhu/p/18440188

相关文章

  • Adobe Animate AN2024电脑动画程序下载安装(附百度链接)
    目录简介软件特点下载推荐硬件配置简介AdobeAnimate,是Adobe公司开发的一款专业多媒体创作和电脑动画程序。它的前身是AdobeFlashProfessionalCC,自1996年首次发布以来,经历了多次更名和升级,现已成为动画制作、交互式内容设计等领域的重要工具。AdobeAnimate不仅支持......
  • 图灵完备攻略:第一部分——基础逻辑电路搭建(附带游戏压缩包)
    作者在学习计算机组成原理时了解到了一款名为图灵完备的游戏,这是一款学习处理器架构的游戏,在游戏中你需要从门电路开始,最终搭建出属于自己的计算机。由于学习计算机组成原理的最后目的就是想让我们学会如何搭建一个CPU,因此这款游戏可以作为想要构建属于自己的CPU的前置练习,......
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能
    前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(3)生成范围检测框+重置框选操作-CSDN博客本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程我只是对重要功能进行分析和做出笔记分享,并未无师自通,吃水不忘打井人本案例的实现流程图 本节实现效果分析......
  • 学霸带你游戏化基本数学解谜提升计算能力
    多样化数学操作的探究在数学的学习过程中,绝对值运算、分式化简、根号运算和多项式除法都是基础且重要的内容。这些概念不仅在学术上具有重要性,而且在实际应用中也有着广泛的用途。为了帮助读者更好地理解这些数学操作,我们将通过具体的例子和实际的应用来深入探讨每一个概念。......
  • 学霸带你游戏化笔记整理就像玩游戏一样有趣
    掌握笔记的技巧在信息丰富的现代社会,无论是管理工作任务还是提升游戏表现,有效的笔记技巧都能大大提高我们的效率。笔记不仅仅是简单的记录工具,它能够帮助我们更好地组织、分析和应用信息。本文将通过具体的游戏案例,详细探讨如何选择合适的笔记工具、优化笔记的结构和格式、提......
  • 如何做好游戏中美术项目管理?TAPD带你挣脱海量Excel困扰
    这两年国内手游竞争日趋白日化,版号的限制、买量内卷、国内用户增量日趋饱和,大厂更是把游戏美术和宣发美术卷到了影视级的高度,游戏美术设计的方向早已走向了全球化。有别于其他项目类别,在游戏项目中,尤其是大型游戏项目团队,都设立了美术项目经理的岗位,称之为APM。作为一个APM,......
  • 游戏修改器Cheat Engine CE v7.5修改版下载安装详细方法
    CheatEngine是一个专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。具体安装方法如下:地址:CheatEngine7.5.zip解压文件夹,将CheatEngine.exe发送到桌面快......
  • 搜索:如何用 A*搜索算法实现游戏中的寻路功能?
    搜索:如何用A*搜索算法实现游戏中的寻路功能?在游戏开发中,寻路功能是一个非常重要的部分。它可以让游戏中的角色自动找到从一个位置到另一个位置的最佳路径。A搜索算法是一种常用的寻路算法,它可以在复杂的地图环境中快速找到最短路径。本文将详细介绍如何用A搜索算法实现游......
  • 解决win10无法用独显玩游戏的问题
    首先要下载独显驱动。https://www.nvidia.cn/Download/index.aspx?lang=cn这时任务管理器里就可以看到独显占用率了。然后桌面右键打开nvidia控制面板,把要使用独显的游戏设置为使用独显(如果默认不使用独显的话)如果还不行,可能是还需要装上CPU的核显驱动(很奇怪吧?我也觉得)intel......
  • java计算机毕业设计网络游戏虚拟交易平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着网络技术的飞速发展与普及,网络游戏已成为全球范围内广受欢迎的休闲娱乐方式之一。这一趋势不仅催生了庞大的玩家群体,也孕育了繁荣的虚拟经济体系......