• 尼姆博弈


    问题描述 :

      有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 个即可。

    东北日出西边雨 道是无情却有情
  • 相关阅读:
    Mysql 备份 导入导出
    简 历
    Mysql 表结构 创建 限制 关联
    Unity 碰撞检测
    Unity 获取键值
    关于大型网站系统的一些问题
    关于zookeeper
    dubbo分布式和消息队列
    集群
    cookie及安全问题
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8997233.html
Copyright © 2020-2023  润新知