算法题每日一练---第75天:Nim 游戏

简介: 你和你的朋友,两个人一起玩 Nim 游戏。

3.png

一、问题描述


你和你的朋友,两个人一起玩 Nim 游戏

  • 桌子上有一堆石头。
  • 你们轮流进行自己的回合, 你作为先手
  • 每一回合,轮到的人拿掉 1 - 3 块石头。
  • 拿掉最后一块石头的人就是获胜者。


假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false


题目链接:Nim 游戏


二、题目要求


样例

输入: n = 4
输出: false 
解释: 以下是可能的结果:
1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。
在所有结果中,你的朋友是赢家。


考察

数学思想、博弈论
建议用时15~35min


三、问题分析

一开始想要递归的,但可能超时,我就转向动态规划了。

true
true
true
false  
true
true
true
false  
true
true

前三个状态是定义好的,从第四个开始可选的状态有-1、-2、-3三种,我们只需要取反这三种状态的结果就行了。

class Solution {
public:
    bool canWinNim(int n) {
        int i,dp[n+1];//动态规划
        if(n<4)//前三个初始
            return true;
        dp[1]=dp[2]=dp[3]=1;//变量初始
        for(i=4;i<=n;i++)//循环判断
        {
            if(!dp[i-1]||!dp[i-2]||!dp[i-3])//关系归纳
                dp[i]=1;
            else
                dp[i]=0;
        }
        return dp[n]==1;//输出结果
    }
};

4.png

数据过大,超时了

总结的规律如下:

true
true
true
false  X
true
true
true
false  X
true
true
true
false  X
true
true
true
false  X
true
true
true
false  X

只要是4的倍数,输出false,其余输出true。

心路历程:递归过深→dp超时→总结规律。


四、编码实现


class Solution {
public:
    bool canWinNim(int n) {
        if(n%4==0)//规律
            return false;
        else
            return true;
    }
};

五、测试结果5.png

相关文章
|
11天前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
26 1
|
5天前
|
算法
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
|
8天前
|
算法 Python
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
【python】python基于 Q-learning 算法的迷宫游戏(源码+论文)【独一无二】
|
2月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
2月前
|
算法 JavaScript 前端开发
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
35 1
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
2月前
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
|
2月前
|
SQL 算法 数据可视化
python 贪心算法 动态规划实现 跳跃游戏ll【力扣题45】
python 贪心算法 动态规划实现 跳跃游戏ll【力扣题45】
|
3月前
|
存储 算法 PHP
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
26 1
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
|
3月前
|
算法 定位技术 C语言
推箱子游戏(算法设计)
推箱子游戏(算法设计)

热门文章

最新文章