题目描述:

你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

输入: 4

输出: false

解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;

因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

思路

简单题,巴什博弈。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

对于巴什博弈,那么我们规定,如果最后取光者输,那么又会如何呢?

(n-1)%(m+1)==0则后手胜利

先手会重新决定策略,所以不是简单的相反行的

JAVA SOLUTION

class Solution {

public boolean canWinNim(int n) {

return n % 4 == 0 ? false : true;

}

}

扩展

威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。

那么任给一个局势, (a,b),怎样判断它是不是奇异局势呢?我们有如下公式:

指的是这样的一个博弈游戏,目前有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:

1)每一步应取走至少一枚石子;每一步只能从某一堆中取走部分或全部石子;

2)如果谁取到最后一枚石子就胜。

判断当前局势是否为必胜(必败)局势:

把所有堆的石子数目用二进制数表示出来,当全部这些数按位异或结果为0时当前局面为必败局面,否则为必胜局面;

#include

using namespace std;

int temp[ 20 ]; //火柴的堆数

int main()

{

int i, n, min;

while( cin >> n )

{

for( i = 0; i < n; i++ )

cin >> temp[ i ]; //第i个火柴堆的数量

min = temp[ 0 ];

for( i = 1; i < n ; i++ )

min = min^temp[ i ]; //按位异或

if( min == 0 )

cout << "Lose" << endl; //输

else

cout << "Win" << endl; //赢

}

return 0;

}

斐波那契博弈

有一堆个数为n的石子,游戏双方轮流取石子,满足:

1)先手不能在第一次把所有的石子取完;

2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。

约定取走最后一个石子的人为赢家,求必败态。

这个游戏叫做斐波那契博弈,肯定和斐波那契数列:

有密切的关系。如果试验一番之后,可以猜测:先手胜当且仅当n不是斐波那契数。换句话说,必败态构成斐波那契数列。

java nim游戏_LeetCode 292. Nim游戏相关推荐

  1. Java实现 LeetCode 292 Nim游戏

    292. Nim 游戏 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解 ...

  2. Nim 游戏 、⽯头游戏1、石头游戏2

    Nim 游戏 .⽯头游戏1.石头游戏2 文章目录 Nim 游戏 .⽯头游戏1.石头游戏2 **一:Nim 游戏** **二:⽯头游戏** **三.石头游戏2** **方法一:DP 函数** **方法二 ...

  3. anti-Nim游戏(反Nim游戏)简介

    许多部分资料选自clover_hxydalao的Blog 定义 游戏规则与Nim类似,只是最后把石子取完的人输. 结论 先手必胜的条件为 ①:所有堆的石子数均=1,且有偶数堆. ②:至少有一个堆的石子 ...

  4. 取石子游戏详解NIM

    取石子游戏详解NIM 分类: 编程之美2014-09-13 09:38 478人阅读 评论(3) 收藏 举报 编程之美 目录(?)[+] http://blog.csdn.net/pipisorry/ ...

  5. LeetCode 292. Nim Game

    292. Nim Game 尼姆游戏 You are playing the following Nim Game with your friend: 您正在和您的朋友玩以下NIM游戏: There ...

  6. Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测

    ***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来.当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测 题目 题目描述与运行示例 破题 ...

  7. 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能

    功能 Java开发的小球躲避小游戏.通过上下左右按键控制小球移动,小球移动的方向包括:横向.纵向.斜向,小球具有初始生命值.小球通过移动来躲避炮弹,当小球碰到炮弹时,产生爆炸的动画效果. 使用双缓冲方 ...

  8. LeetCode 292 Nim Game

    LeetCode 292 Nim Game https://leetcode.com/problems/nim-game/ 当能被4整除时,才会输. bool canWinNim(int n) {re ...

  9. Java写一个简单的扫雷游戏

    〇.目录 一.前言 二.过程中遇到的困难 三.代码 四.成品图 五.代码存在的bug 六.完善建议 七.结语 一.前言 这个学期学习了Java,课程的最后一项作业就是做一个扫雷游戏和一个计算器,经历一 ...

最新文章

  1. BZOJ4590 [Shoi2015]自动刷题机
  2. 五大常用算法之二:动态规划算法
  3. 【转】Linux Netfilter实现机制和扩展技术
  4. Python入门字符串
  5. Chapter1-7_Speech_Recognition(Language Modeling)
  6. 【OJ】洛谷循环结构题单题解锦集
  7. DBA最缺的不是技术
  8. Android 之 网络连接(Connecting to the Network)
  9. linux mysql 密码策略_linux密码策略
  10. web前端开发前景如何
  11. 【转】机器人领域的SCI期刊杂志和国际会议
  12. Gd-DTPA钆元素钆元素对比磁共振造影剂 氟-19磁共振/荧光双模态显影剂19F MRI
  13. 稳态误差,超调与PID的关系
  14. 视频网站视频倍速的方法(亲测B站、百度网盘)
  15. python f检验 模型拟合度_python 线性回归分析模型检验标准--拟合优度详解
  16. Redis跳跃表源码解析
  17. 静夜思 | 你的眼界,决定了你发现美好的能力
  18. 计算机毕业设计ssm电影售票管理系统n9y72系统+程序+源码+lw+远程部署
  19. 苹果IOS修改定位2-IAP2协议修改
  20. 美国股票市场上市规则摘要纽约证券交易所

热门文章

  1. 分享懒人张RDLC报表(五、六)
  2. SQL中Group By的使用
  3. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(五):扩展burp代理
  4. JAVA垃圾分类网站计算机毕业设计Mybatis+系统+数据库+调试部署
  5. 基于React的企业级实战项目的宜居商场
  6. 动态新闻标题热点分析
  7. Vue 获取URL中的参数
  8. QT 关于使用QThread实现多线程(moveToThread)
  9. python弹球游戏移动球拍_python编写弹球游戏的实现代码
  10. linux语法 2022年4月14星期四