zoukankan      html  css  js  c++  java
  • 尼姆博弈

    问题描述 :

      有N堆物品,其中第 i 堆有 pi 个物品,每次从一堆中选出若干个物品去掉(但不能为 0 ),两人轮流取物品,谁不能取谁就输了,问什么情况下会先手必胜?

      

    代码示例 :

    int main() {
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        int n, x;
        
        while(~scanf("%d", &n)){
            int s = 0;
            for(int i = 1; i <= n; i++){
                scanf("%d", &x);
                s ^= x;
            }
            if (s == 0) puts("No");
            else puts("Yes");
        }
        return 0;
    }
    

    尼姆博弈有几种经典的扩展形式

    1 . 限定每次取物的上限

     问题 : 有 n 堆物品,其中第 i 堆有 pi 个物品,每次将去掉某一堆里最多的 m 个物品(m > 0),两人轮流取物品,谁不能取谁就输了

     结论 : 分别将 pi 对 m +1 取余,等到一组新的 pi 值,然后取将这组 pi值取异或,记结果为 s,若 s 为0,则为 p 局面,否则是 N局面

     证明 : 进行过上述操作后,可以得到两组数据,一组是新的 pi 值, 一组是 ri 值,表示 m+1 的整倍数,当先手这个人面对N居民,就按照Nim 的取法在pi 堆中取,当输的人如果在 ri 堆中取时,此时先手的人则在 ri 堆中选取 m+1-k 个即可。

    东北日出西边雨 道是无情却有情
  • 相关阅读:
    第十章学习笔记
    MyOD(选作,计入平时成绩)
    学习笔记第九章
    第一、二章学习笔记
    团队作业(一):团队展示
    C语言实现Linux下od -tx -tc XXX的功能
    第七、八章学习笔记
    Sort 在 Linux
    Linux C语言编程基础
    MyOD
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8997233.html
Copyright © 2011-2022 走看看