zoukankan      html  css  js  c++  java
  • BZOJ 1022: [SHOI2008]小约翰的游戏John Nim游戏简要笔记

    按照现在的OI科技发达程度,这题只能当作NOIP普及组考考了。

    很简单的Nim游戏模板题,但是仍然需要知道Nim游戏的策略,否则无法想象怎样在考试的时候自己YY出正解来(也可能是本蒟蒻理解不了大佬们的思维吧^_^)

    基础的Nim游戏分两种,一种是拿到最后一颗石子的人赢,另一种就是拿到最后一颗石子的人输。

    Nim的策略是这样的:先手要让自己行动后每一堆石子大小的异或和为0。

    怎样保证下一步的异或和为0呢?记每堆石子的大小为\( s_i \),\( x = s_1 \oplus s_2 \oplus \dots \oplus s_n \),\( t_i = x \oplus s_i \),那么选择\( t_i < s_i\)的一堆石子并从中拿走\( s_i-t_i \)颗石子即可满足异或为0的要求。这一点只需经过验算即可证明。

    为什么先手要让异或和为0呢?假如\( x = 0\),后手此时无论选择哪堆石子拿,由于\( s_i \not = t_i \),因此\( x \oplus s_i \oplus t_i \not = 0 \),即后手无论如何都不能使得自己行动之后的异或和为0,然而既然目的是拿光石子,必要条件是让自己行动后的异或和为0,无法满足这个条件的后手不可能赢。

    然而为什么每次都可以找到一堆满足\( t_i < s_i \)的石子呢?如果令\( x \)的二进制最高位为\( d \),那么\( s \)中肯定有奇数个最高位也为\( d \)的(\( s \)的元素里可能有偶数个最高位超过\( d \)的)。这样,选择其中一个,它与\( x \)的异或和必定没有最高位\( d \),也就是说\( t_i < s_i \)。

    如果目的是不要拿最后一颗石子呢?好像就不太适用于上面的策略了。事实上两者的策略是一模一样的,只是在最后一步略微不同而已。按照自然规律,游戏必定会到这样一种局面:其中有若干堆石子(也可能没有)每堆只有一颗石子,并且存在另一堆石子有2个或更多的石子(这是肯定会有的,除非最开始的堆都只有1颗石子)。如果要拿到最后一颗石子,先手需要让后手面对偶数堆只有一颗石子的局面,这时ta就可以选择性的让那堆有两颗或更多石子的变成只有一颗石子或者是直接拿掉。如果是不要拿最后一颗石子,一样的,先手需要让后手面对奇数堆只有一颗石子的局面,同样的也可以选择性的处理那堆有两颗或更多石子的。

    在最后的处理中可能就不会遵守之前的基本策略了。但是毕竟这是游戏,只要能赢,用什么方法都可以对吧?^_^

    从上面的过程可以看出来,先手占据的优势是很明显的(除非一开始只有一颗一颗的石子),因为无论后手选择怎样的策略,先手都可以让石子的异或和为0,或者是在最后时刻灵活应变,保证自己可以赢。所以这种策略是最优的。

    更多关于Nim游戏的应用可以参考wiki

  • 相关阅读:
    base64编码
    ios开发之指纹识别
    date
    php的学习
    mac下安装mysql遇到的无法连接的问题
    关于git上传文件过大报错的问题 remote: warning: Large files detected.
    安卓开发中Theme.AppCompat.Light的解决方法
    ubuntu操作系统中卸载mysql的安装与卸载
    重新格式化删除U盘隐藏分区与如何在LMT下安装非Ghost win7
    网易有道笔试2015-05-12
  • 原文地址:https://www.cnblogs.com/HailJedi/p/9176169.html
Copyright © 2011-2022 走看看