• Nim Game,一个有趣的游戏,也是一道入门算法题。


    Nim Game,其实很多人都玩过。其实就是我们玩的划线游戏。

    一张纸上,画若干条线,双方一人划一次,每次划掉1~3条线。可以选择画1条,也可以划2条,也可以3条。具体划去几条线完全看自己的策略。谁划掉最后一条线,就是赢家。
    Nimgame

    如上图,蓝方获胜。

    正在看这篇文章的你一定是一个聪明人,每一步都是最优解,而你的对手,也跟你一样聪明,每步都是最优的解法。
    现在你作为先手,在线条总数为多少的时候,你必赢呢,又在多少的时候必输呢?

    可不可以用一个函数来判断在线条总是为x时你的输赢情况呢?这样你以后跟别人玩这个游戏的时候就不会输啦。

    答案是可以,不过我们要先来分析一下这个问题。

    在线的总是为多少的时候一定会输呢。


    每人每步最多划三条线,所以线的总是至少为4条。当线的总数为4条的时候,不管先手划几条线,后手都有应对的方法,先手必输。

    所以你会发现8条也是必输,8条线可以分成两个部分,每个部分四条线。自然先手还是必输。4这个数字还真是不太吉利。

    当线的总数为5条的时候,先手先划掉一条线,后手就等于是在4条线的情况下先手,自然后手输。

    而6条 7条 先手都可以划掉2条线和3条线来让后手落入“4”的陷阱。

    所以我们可以看出,我们只要远离”4“就行了。当线的总数不是4的倍数的时候,先手必赢。

    看到这里,恭喜你掌握了必胜法则,下次各位盆宇就可以用这个游戏跟别人打赌了。


    所以现在我们可以将我们的结论写到代码里了。

    在这里我将实现一个C语言的函数:

    bool canWin(int n) {
        return n%4;
    }

    参数 n 代表的是线条的总数。 通过线条总是是否能被4整除来判断这场比赛中作为先手的你必赢还是必输。

    当 n%4 的结果为0时意味着n能被4整除,返回0,转换为布尔值为false。

    当n%4不等于0时意味这n不能被4整除,返回非0,转换为布尔值为true。


  • 相关阅读:
    B/S---控件属性
    Windows Form -----内容(11)
    C#--Web控件简介
    C#控件基本1
    C#增删改小总结
    C#播放器控件的常用方法介绍
    C#封装---小练
    链接SQL、事务---小总结
    事务-----2
    事务----1
  • 原文地址:https://www.cnblogs.com/wchyi/p/5551434.html
Copyright © 2020-2023  润新知