Nim游戏

2023-11-18

Nim游戏:一共有N堆石子,编号从1到N,第i堆中有a[i]个石子。有A和B两个人。依次拿石子,每次可以从任意堆中拿任意数量的石子,至少拿一颗。至多拿着一堆剩下的所有石子。两个人轮流行动;取光所有石子的一方获胜(最后一次拿石子的那一人获胜)。假定A先手,且两人都会常用最优策略,A会不会获胜?

解题思路:
题目问的是会不会有一方稳赢的情况和策略。这是一个数学问题,有一个结论:就是将这N个数(剩余的数)转换为二进制然后进行异或操作得到一个结果S。S有为0和不为0两种情况;如果A下先手的时候S不为0,那么A就可以稳赢。

这是因为当S不为0时,可以通过拿一定的数量使得S为0;当S为0时,不管拿多少都会使得S不为0。所以只要一方掌握了S不为0的情况就可以使得S在0和非0之间不断变化,最终自己可以成为最后一次拿石子的人。

代码如下:


public class Nim游戏 {
	public static void main(String[] args){
		int[] arr = {3,4,5};
		System.out.println(f(arr));
	}

	private static boolean f(int[] arr) {
		int sum = 0;
		for(int i=0; i<arr.length; i++){
			sum = sum ^ arr[i];
		}
		if(sum!=0) return true;
		return false;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nim游戏 的相关文章

随机推荐

  • Mysql教程(二):DDL学习

    Mysql教程 二 DDL学习 DDL Data Definition Language 数据定义语言 用来定义数据库对象 数据库 表 字段 1 DDL数据库操作 查询 查询所有数据库 SHOW DATABASES 查询当前数据库 SELE
  • 【华为OD】华为性格测试(综合测试)高分策略

    性格测试 综合测试 注意 1 性格测试非常重要 是一次否决制 18 个月有效期 所以态度一定要认真对待 不要随便乱选 2 做题原则 正向原则 积极乐观向上 3 时间为 25 30 分钟 会频繁出现重复选项重复出现的题目注意一致性 提示 1
  • 排列数组使得偶数在奇数的前面

    Name ReorderOddEven c Author 齐保元 Version Copyright Your copyright notice Description Hello World in C Ansi style include
  • 对js运算符“

    首先出个题 如图 假设对成长速度显示规定如下 成长速度为5显示1个箭头 成长速度为10显示2个箭头 成长速度为12显示3个箭头 成长速度为15显示4个箭头 其他都显示都显示0各箭头 用代码怎么实现 差一点的if else Js代码 var
  • 100天精通Python(基础篇)——第6天:标识符

    规则1 内容限定 限定只能使用 中文 英文 数字 下划线 注 不能以数字开头 规则2 大小写敏感 可以区分大小写 规则3 不可使用关键字 for while return等
  • (简单成功详细)CentOS 安装 node.js

    个人感觉比较好用的方法 目录 方法一 方法二 安装指定版本的nodejs并配置环境变量全局模块方法 方法一 1 安装yum sudo yum install epel release 2 安装nodejs sudo yum install
  • 我的2017年度技术回顾

    我为之前浪费的大把光阴后悔不已 如今正奋起直追 不知 为时可晚 较早是从事传统软件开发 主要以交付项目为主 后来慢慢转向互联网 属先知后觉那一类 一直从事Java软件研发管理工作 时下热门的小程序 大数据 人工智能 机器学习等接触很少 一方
  • volatile保证可见性,原理是什么

    VOLATILE 只保证可见性 Java多线程内存可见性 并不保证原子性 可见性 一个线程对共享变量的修改 更够及时的被其他线程看到 原子性 即不可再分了 不能分为多步操作 比如赋值或者return 比如 a 1 和 return a 这样
  • 使用本地Windows创建密钥连接GitHub时发现你的git根目录里没有.ssh文件夹怎么办?

    首先 你在桌面右击进入Git Bash 输入如下命令查看git配置中是否有自己的GitHub账号名和邮箱 git config list 一般你自己不设置是不会有的 那就自己在本地创建一个账号名和邮箱 引号中填写你的账号名 git conf
  • Python:Tornado框架之获取get和post的传参

    一 获取get方式传参 import tornado ioloop 导入tornado包 import tornado web class MainHandle tornado web RequestHandler def get self
  • number1(python)

    1抽 签 你的朋友提议玩一个游戏 将写有数字的 I个纸片放入口袋中 你可以从口袋中抽取 4 次纸 片 每次记下纸片上的数字后都将其放回口袋中 如果这 4 个数字的和是m 就是你赢 否 则就是你的朋友赢 你挑战了好几回 结果一次也没赢过 于是
  • 梦幻手游服务器维护摆摊公示时间,梦幻手游5月4日维护公告 摆摊交易优化

    亲爱的玩家朋友 为保证服务器的运行稳定和服务质量 梦幻西游 手游所有服务器将于2016年5月4日8 00停机 进行维护工作 预计维护时间为8 00 9 00 如果在预定时间内无法完成维护内容 开机时间也将继续顺延 请各位玩家相互转告 并提前
  • wm命令详解

    usage wm subcommand options wm size reset WxH WdpxHdp wm density reset DENSITY wm overscan reset LEFT TOP RIGHT BOTTOM w
  • Ubuntu操作系统学习笔记之安装和配置Apache2

    在Ubuntu中安装apache 安装指令 sudo apt get install apache2 安装结束后 产生的启动和停止文件是 etc init d apache2 启动 sudo apache2ctl k start 停止 su
  • C++的sort函数对于vector排序

    对于vector
  • llvm 介绍有用的网站

    LLVM笔记 7 指令的side effect LLVM笔记 7 指令的side effect Five100Miles 博客园 LLVM每日谈之十八 GEP Instruction的几点总结 LLVM每日谈之十八 GEP Instruct
  • 用docker搭建公司内部的gitlab 和 wiki

    docker run name gitlab d link gitlab postgresql postgresql link gitlab redis redisio publish 10022 22 publish 10080 80 e
  • 使用jasypt为springboot配置文件加密

    使用jasypt为配置文件加密 配置项明文可能出现的问题 先看一份典型的配置文件 配置MySQL数据库连接 spring datasource driver class name com mysql jdbc Driver spring d
  • 【为什么】C++中的#pragma once是干什么,和#include guard区别

    一 pragma once是C和C 编程语言中的一个非标准但广泛支持的预处理指令 用于使当前源文件在单次编译中只被包含一次 它与 include guards有相同的作用 但有一些优点 如 代码更少 避免名称冲突 有时可以提高编译速度 代码
  • Nim游戏

    Nim游戏 一共有N堆石子 编号从1到N 第i堆中有a i 个石子 有A和B两个人 依次拿石子 每次可以从任意堆中拿任意数量的石子 至少拿一颗 至多拿着一堆剩下的所有石子 两个人轮流行动 取光所有石子的一方获胜 最后一次拿石子的那一人获胜