编程之美4 Nim游戏

news2024/11/15 6:59:10

Tag:贪心;动态规划

题目

  1. N块石头排成一行,每块石头有各自固定的位置。两个玩家依次取石头,每个玩家每次可以取其中任意一块石头,或者相邻的两块石头,石头在游戏过程中不能移位(即编号不会改变),最后能将剩下的石头一次取光的玩家获胜。这个游戏有必胜策略嘛?
  2. 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜。每次取石头时,每个玩家只能从若干堆石头中任选一堆,取这一堆石头中任意数目(大于0)个石头。玩家A怎么分配和取石头才能保证自己获胜?
  3. 假设有两堆石头,有两个玩家会根据如下的规则轮流取石头:
    1. 每人每次可以从两堆石头中各取出数量相等的石头,或者仅从一堆石头中取出任意数量的石头;
    2. 最后把剩下的石头一次拿光的人获胜。

思路与算法

问题一

假设编号为1,2,3,4,5.取相邻的两块石头是指可以取12,但是如果先把2号石头拿走了,是不可以取13的,认定此时两块石头是不相邻的。
我们可以先用列举的方式来找规律,假设A先取:
N = 1,A必赢;
N = 2,A必赢;
N = 3,A取中间的必赢;
N = 4,A取中间的两个必赢;
N = 5,A取中间的一个必赢;
N = 6,A先取中间的两个必赢;

A取中间的石头使得左右两边留下相同的数目就必赢(如果N为偶数,取中间的两个;如果N为奇数,取中间的一个)。

思考:如果最后能将剩下的石头一次取光的玩家判定为输,那是否有必胜策略呢?

同样先来列举思路,假设A先取:
N = 1,<1>,A必输;
N = 2,<1,1>,A只拿一个必赢;
N = 3,<1,1,1>,A只拿相邻两个,剩下<1>,必赢;
N = 4,<1,1,1,1>,A拿走最边上的一块变成<1,1,1>;拿走最边上的两块变成<1,1>;拿走中间的一块变成<1,1,0,1>;拿走中间的两块变成<1,0,0,1>;都必输;
N = 5,<1,1,1,1,1>,A拿走最边上的一块变成<1,1,1,1>必赢;

对于N块石头,N足够大.便有以下结论:
如果N块石头你必输的话,那么N+1,N+2你必赢.因为你可以取走边角的1块或2块,然后就剩下了N块石头,并且是对手取,对手必然会输.
所以推出(k为任意整数):
N = 3K + 1.B赢
N = 3K + 2,A赢
N = 3K + 3,A赢

问题二

同样用列举的方式,用N表示石头的堆数,M表示总的石头数目。
当N = 1 时,A必输;
N = 2,如果(1,1)A必赢;如果(1,X),B可以拿走小于X - 1 的石头,A必输;如果(2,2)(3,3)…都是A必赢;

当摆放方法为(1,1,…,1)的时候,如果1的个数是奇数个,则先拿者赢;如果1的个数是偶数个,则先拿者必输;
当摆放方法为(1,1,…,1,X),先拿者必赢;
此外还有其他的摆放方法,比如N = 9,(2,3,4)
可以考虑异或原理:
XOR(0,0) = 0
XOR(1,0) = 1
XOR(1,1) = 1
推理整个游戏过程,从N堆石头(M1,M2,M3)开始,石头一直递减到全部为(0,0,…,0)
当M为奇数时,无论怎么分堆,都是B赢;其他的我们只要保证每次将XOR(M1,M2,…,M3) = 0,就能保证赢的局面。

问题三

可以利用质数筛子的方法来列举,用数对(m,n)表示一堆石头有m块,另一堆有n块。删除所有A必赢的局面:
在这里插入图片描述
剩下的如下图:
在这里插入图片描述
可以得出结论,一般而言,第n组的不安全局面(an,bn)可以由以下定义得到:

  1. a1 = 1, a2 = 2;
  2. 若a1,b1,…,an - 1,bn - 1已经求得,则定义an为未出现在这2n-2个数中的最小整数
  3. bn = an + n;
    做成表格:
    不安全局面表
    两堆石子的个数只要不能由表格中的数据推出来,则说明A必胜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在ASF中使用On Demand生产DEM等产品时使用不同参考DEM的区别

在ASF中使用On Dmand生产DEM等产品时使用不同参考DEM 主要有两种DEM&#xff0c;分别是SRTM和COP-DEM&#xff08;GLO-30&#xff09; 当我们添加Dmand进程之后&#xff0c;点击On Demand Queue 然后进入On Demand界面&#xff08;如下图所示&#xff09; 在Processing Op…

MySQL主从复制介绍及实操演示

1. 基本概念 MySQL主从复制的主要效果简单来说是将两个单独的数据库服务器关联起来&#xff0c;对于主机&#xff08;Master&#xff09;以及从机&#xff08;Slave&#xff09;&#xff0c;从机的数据会伴随着主机数据的变化而同步 2. 主从复制作用 可以解决单个MySQL数据库…

leetcode 63. 不同路径 II

文章目录题目思考代码和注释总结题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑…

Android WorkManager使用介绍

一、引言 WorkManager 是google提供的异步执行任务的管理框架&#xff0c;是 Android Jetpack 的一部分&#xff0c;会根据手机的API版本和应用程序的状态来选择适当的方式执行任务。   在后台执行任务的需求是非常常见的&#xff0c;Android也提供了多种解决方案&#xff0c…

高阶数据结构:并查集

本篇主要是介绍并查集的内容&#xff1a;所谓并查集就是一种描述不相交集合的数据结构&#xff0c;即若一个问题涉及多个元素&#xff0c;它们可以划分到不同集合&#xff0c;同属一个集合内的元素等价&#xff0c;不同集合内的元素不等价。 文章目录 一、并查集原理二、并查集…

Prophet在R语言中进行时间序列数据预测

您将学习如何使用Prophet&#xff08;在R中&#xff09;解决一个常见问题&#xff1a;预测公司明年的每日订单。 最近我们被客户要求撰写关于时间序列的研究报告&#xff0c;包括一些图形和统计输出。 数据准备与探索 Prophet最适合每日数据以及至少一年的历史数据。 我们将…

Ansible

Ansible是什么&#xff1f; Ansible是一个基于eythn开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pbet和Saltstack能实现的功能&#xff0c;As;ble基本上都可以实现。Ansible能批量配置、部署、管理上…

MongoDB入门与实战-第五章-MongoDB副本集

目录参考一、副本集概念1、**主要功能**2、主从复制和副本集区别3、复制结构图二、副本集成员角色1.主节点2.副本节点3.仲裁节点三、副本集架构&#xff08;一主一副本一仲裁&#xff09;1、**设置读操作权限&#xff1a;**2、取消作为奴隶节点的读权限四、选举原则1、触发条件…

时序逻辑电路

数字电路分为两大类&#xff0c;组合逻辑电路和时序逻辑电路 今天我们要开始学习的是时序逻辑电路&#xff0c;要求大家掌握 同步逻辑电路的分析方法 常用的时序逻辑电路的使用方法 当然由于时序逻辑电路的特点&#xff0c;使得时序逻辑电路难度远远大于组合逻辑电路 电路任…

一文详解Redis键过期策略,最全文档

文章目录1 设置带过期时间的 key1.1 刷新过期时间1.2 Redis 之前的 2.1.3 的差异1.3 返回值1.4 示例1.5 带过期时间的 key1.6 过期精度1.7 过期和持久化2 Redis的key过期策略2.1 惰性删除2.1.1 优点2.1.2 缺点定时删除优点缺点2.2 定期删除优点缺点难点定期删除流程Redis采用的…

SpringMVC异常处理器

1.异常 1.1 异常结构层次 异常主要分为&#xff1a;错误、一般性异常&#xff08;检查异常&#xff09;、运行期异常&#xff08;非受控异常&#xff09; 错误&#xff1a;如果应用程序出现了 Error&#xff0c;那么将无法恢复&#xff0c;只能重新启动应用程序&#xff0c;最…

VUE3-工作笔记-06

本节&#xff1a;总结11月份学习的内容 1.如果有很多个功能是一样的&#xff0c;那就先写一个测试很多次&#xff0c;确定没有bug再全部改&#xff0c;不然辛辛苦苦全部改了之后&#xff0c;发现还是有bug又要重新改&#xff0c;最好是写成组件的形式&#xff0c;写成hook。 …

ACM第三周---周训---题目合集.

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石.CSDN &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;ACM周训练题目合集.CSDN &#x1f4ac;总结&#xff1a…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.7 数据卷命令

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.7 数据卷命令10.7.1 数据卷10.7.2 操作数据卷10.7.3 直接…

度量方法总结

本文目录0 引言1 度量差异性1.1 闵可夫斯基距离&#xff08;Minkowski distance&#xff09;1.1.1 欧氏距离&#xff08;Euclidean distance&#xff09;1.1.2 曼哈顿距离&#xff08;Manhattan distance&#xff09;1.1.3 切比雪夫距离&#xff08;Chebyshev distance&#xf…

[附源码]JAVA毕业设计课程网站设计(系统+LW)

[附源码]JAVA毕业设计课程网站设计&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

Spring Boot 框架整合 MyBatis 连接数据库,详细说明

在我们日常的开发过程中&#xff0c;肯定不可避免的会使用到数据库以及 SQL 语句。比如&#xff0c;刚开始学习 Java 的时候可能会遇到 JDBC&#xff0c;它是连接 Java 和数据库的桥梁&#xff0c;我们可以使用 JDBC 来建立与数据库之间的连接并且执行相应的 SQL 语句。虽然 JD…

数据结构—List集合

文章目录一、ArrayList集合1&#xff0c;ArrayList集合的特点2&#xff0c;ArrayList集合的一些方法添加元素个数获取指定位置元素指定位置插入元素替换元素移除元素判断是否为空判断是否包含元素移除指定元素迭代器遍历集合二、LinkedList集合1&#xff0c;LinkedList集合的特…

Ra-01SC/Ra-01SCH模组驱动

目录简介硬件准备设备清单接线说明重要函数说明调试联系我们简介 本文档主要介绍Ra-01SC/Ra-01SCH模组驱动例程使用方法&#xff1b; 硬件准备 设备清单 硬件数量Ra-001SC/Ra-01SCH 模组2个杜邦线若干USB转TTL模块2个STM32F103C8T6开发板2个安卓线2根 接线说明 STM32F103C…

[论文阅读] 颜色迁移-直方图渐进式颜色迁移

[论文阅读] 颜色迁移-直方图渐进式颜色迁移 文章: 有2篇相关的文章, 都为同一作者 [Progressive histogram reshaping for creative color transfer and tone reproduction], [code未公开][Progressive color transfer for images of arbitrary dynamic range], [code未公开]…