首页 > 其他分享 >浅谈Nim游戏

浅谈Nim游戏

时间:2023-12-15 20:15:59浏览次数:33  
标签:状态 一堆 游戏 Nim 必胜 浅谈

浅谈Nim游戏

  • 首先,我们需要了解 \(Nim\) 游戏是什么东西。

  • \(Nim\) 游戏指:两个人,有 \(n\) 堆数,每堆有 \(a_i\) 个,每次可以且仅可以取一堆中的若干个数,求问先手有没有必胜策略(当然两个人都足够聪明)。

  • 首先,先研究显然的必胜策略。比如,我们要得到 \(0\) 这个数,那么当你取完时还剩下 \(0\) 个。

  • 然后,我们通过最后的这个必胜状态,往前递推找出其余的必胜状态。

  • 显然博弈论是必然会出现循环节的,如果每次都可以取到当前这个循环节上的必胜状态,并且让你的对手能达到的下个状态全部都是必败状态,那样你就稳赢。

  • 接着,我们来分析 \(Nim\) 游戏这道题,我们先考虑什么状态下是必胜的:

  • 当 \(n=1\) 的时候,很显然先手必胜,因为先手一次性取完即可。

    • 当然,这里当 \(n ≠ 0\) 时,先手必败。
  • 当 \(==2\) 的时候:我们就需要考虑一堆的石头和另一堆的石头相不相等

  • 如果一堆的石头和另一堆相等,那么不论先手取什么,后手都只需要跟着先手取相同的个数就行了。所以很显然就是先手必败

    • 此时我们可以考虑为:\(a_1\operatorname{xor} a_2 = a\)。
  • 如果一堆的石头和另一堆不相等,那么先手就取 \(|a_1-a_2|\)。就必胜了。

标签:状态,一堆,游戏,Nim,必胜,浅谈
From: https://www.cnblogs.com/Jasonshan10/p/17904090.html

相关文章

  • 植物大战僵尸(初始化游戏数据 )
    #include<iostream>#include<windows.h>usingnamespacestd;/*声明变量*/HWNDhand=NULL;//游戏窗口DWORDpid=0;//游戏进程IDHANDLEhProcess=NULL;//进程对象DWORDBaseValue=0;//游戏数据存放的基础值/*声明方法/函数*/boolstartGame();//初始化游戏数据......
  • Unity引擎2D游戏开发,实现人物下蹲逻辑和动画
    将下蹲动画创建进人物中在Animation窗口中的左侧,新建BlueCrouchStart动画时间轴,然后将下蹲动画拖入时间轴中62,63,64都是下蹲中的动画,但是64号是下蹲动作完毕后的静止动画,因为不拖入时间轴中,单独为其建立一个时间轴为64号下蹲动画完毕的静止动画单独创建一个时间轴,并命名为BlueC......
  • 技术美术|游戏中的流体模拟(Fluid Simulation)
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、闲聊最近一直在研究流体模拟,很神奇的一个东西,好在网上有很多参考资料,研究过程不算太困难。分享下最近一段时间的学习心得。二、效果演示 ......
  • 融合技术之力:跨界电商与游戏产业的无限可能
    随着全球化浪潮的不断涌现,出海跨界电商和游戏产业逐渐成为引领科技发展的双强。本文将深入研究Socks5代理、代理IP等技术在出海跨界电商与游戏领域的技术性应用,揭示它们如何为企业带来更广阔的国际市场以及在游戏领域中创造更丰富的用户体验。1.背景随着数字化时代的来临,跨界电商......
  • P8818 [CSP-S 2022] 策略游戏 题解
    P8818[CSP-S2022]策略游戏题解题目链接P8818[CSP-S2022]策略游戏简化题意小\(A\)先在\(a[l1,r1]\)中选择一个数\(x\),小\(B\)再在\(b[l2,r2]\)中选择一个数\(y\),最后的分数就是\(x\timesy\)。小\(A\)想让分数尽可能地大,而小\(B\)则想让分数尽可能地小......
  • 年关将近,浅谈近年Android开发技术趋势
    前言回头看看2023马上就要结束了,时间过的太快,不敢相信我已经从事Android开发几年了,不免生出一些感叹。那么到了2023年底,Android端会有什么技术趋势吗?或者哪些[新]技术值得去学?又或者对我来说,现在什么[值得]去学?本文我将分享一些我个人的技术学习经历以及分享一些近些年......
  • 浅谈Qt信号槽的实现原理
    背景:1、使用信号槽,需要先“Q_OBJECT”2、通过connect函数进行信号槽绑定3、通过emitsignal()发送信号原理:1、Q_OBJECT是一个预编译命令,可生成很多函数、变量。生成存储Connection对象的列表。2、connect函数需要四个信息:信号发送者、信号、接受者、槽函数connect函数生成......
  • Unity引擎2D游戏开发,实现跳跃动画
    由于跳跃动画分为了很多个部分,所以需要对每个部分进行重新命名。接着,再将此动画分为两大类,一类空中动作(Jumpanimation),一类落地动作(Landinganimation)选择Player人物,在下方Animation中,新建动画动画新建和命名规则,根据guide内的颜色分类来进行新建动画混合树由于动画太多,......
  • Unity引擎2D游戏开发,实现按键行走
    既然是实现按下按键进行一个动作,比如行走动作。那么就需要在InputControl内加入按键,并通过C#代码调用这个按键绑定一个事件来实现此功能在InputControl内加入新的按键打开PlayerInputControl创建一个新的按键组,并绑定Shift(通过Shift键控制行走动作)通过C#代码调用按键,并实......
  • 浅谈 JSON 对象和 FormData 相互转换
    前言大家都知道,前端在和后台进行交互联调时,肯定避免不了要传递参数,一般情况下,params在get请求中使用,而post请求下,我们有两种常见的传参方式:JSON对象格式和formData格式,但是一些场景是需要我们对这两种数据格式进行转换的,例如表单提交,有些是JSON对象格式的数据,有些是F......