最近做一个题, 说是 判断 某个游戏 是否有先手必胜的情况, 在草稿纸上画了画, 想了一阵,发现 把 所有当前游戏的局面描述为一个状态, 状态之间的变化 实际上构成一颗 多叉树, 如果 有先手必胜的情况, 那么这棵树 就会具有某种特点,即 包含某性质的某颗子树, 然后自己 便陷入 严格定义树的特定,然后 试图编码查找这样的树, 发现 挺恼火。

第二天开会的时候, 发现可以不用管这么多。树中某个节点(也就是局面)对于先手来说是必赢,那么说明这个节点的某个子节点 对于 另一方来说 是必输 局面! 至少有一个这样的子节点就可以了。 而某个节点对某方 是必输局面,说明这个节点的所有子节点对另一方而言 都是 必赢局面。

分析到这里, 就是 两个函数而已, 需要互相调用对方, 形成一种间接的递归。这里具体是什么游戏其实是无关紧要的。很多类似的题目都能用这样的方法解决。

你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串。你和朋友轮流将 连续 的两个 “++” 反转成 “–”。 当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。
输入: s = “++++”
输出: true
解析: 起始玩家可将中间的 “++” 翻转变为 “±-+” 从而得胜。
https://leetcode-cn.com/problems/flip-game-ii

代码里面看不到 任何 树的痕迹, 但实际变化在逻辑上是一棵树, 如果要分析时间复杂度,那么必须借助树的结构来分析。

全部代码如下:


#include "haithink_common.h"// 返回true, 则必赢
// 返回false, 不能必赢
bool _canWin(string & s) {// 构造可能的变换, 如果有一个 必输的叶子节点,那么 返回true, 否则返回falsefor (int i = 0; i < s.length() - 1; i++) {if (s[i] == '+' && s[i + 1] == '+') {string ss = s;ss[i] = '-';ss[i + 1] = '-';if (canLose(ss)) {return true;}}}return false;}// 返回true, 则必输
// 返回 false,不是必输
bool canLose(string & s) {// 没有子节点, 那么必输// 如果有子节点,那么每个子节点都必赢,// 如果某个子节点不是必赢, 那么 不是必输for (int i = 0; i < s.length() - 1; i++) {if (s[i] == '+' && s[i + 1] == '+') {string ss = s;ss[i] = '-';ss[i + 1] = '-';if (_canWin(ss) == false) {return false;}}}return true;
}bool canWin(string s) {if (s.length() < 2) {return false;}return _canWin(s);
}int main() {string s = "-+++--+++";output(canWin(s));return 0;
}

博弈,游戏,是否有先手必胜的情况相关推荐

  1. SG函数求解 NIM游戏先手必胜必败问题

    NIM游戏: 两人玩家,给定状态之间转移规则,每个人轮流移动,最终得出胜负. 设P为必败点,N为必胜点 精髓: 能到达必败点的所有点都为必胜点,一般解题都是先找到一个必败点,然后由此点推必胜点 有的题 ...

  2. 吴昊品游戏核心算法 Round 5 ——(转载)关于无禁手下先手必胜的证明

    关于五子棋先手必胜的证明,用人工的方式过于复杂,其难度相当于证明四色定理的正确性或者是若儿当定理的正确性.但是,如果采用计算机来解决,则复杂程度 会降低许多.由于很难地毯式地枚举到所有可能的情形,这一 ...

  3. ferguson博弈_组合博弈游戏

    ² 组合博弈游戏的概念和特点 ² 组合博弈游戏应满足以下性质: ² 1. 有两个游戏者. ² 2. 有一个可能的游戏状态集.这个状态集通常是有限的. ² 3. 游戏规则指定了在任何状态下双方的可能的走 ...

  4. 三个常见博弈游戏以及 SG 函数和 SG 定理

    前言 原文章 通过数论或者自然数性质完美解决的三个常见博弈游戏: 博弈 解决方法 Bash Game 同余理论 Nim Game 异或理论 Wythoff Game 黄金分割 Bash Game 描述 ...

  5. 博弈游戏之三大博弈---bashWythoffNimm

    奇异局势(必败态) 博弈是不公平的游戏  因为只要双方足够聪明   从游戏开始就已经确定了结果 在我们的博弈游戏中 想获取胜利  就要寻找必输状态 要寻找必败状态 首先要知道什么情况下算输 在游戏规则 ...

  6. ACM常见组合博弈游戏

    这两天认识了几个组合游戏的基础模型,希望自己能更新下去.. Ferguson游戏 Description Initial 有两个盒子,一个装有 m 颗糖,一个装有 n 颗糖,表示为 (m, n) . ...

  7. hihoCoder#: 博弈游戏·Nim游戏

    [题目链接]:click here~~ [题目大意]: #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,A ...

  8. Nim 博弈游戏详解

    Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输. 后来,在一份资料上看到,这种游戏称为"拈(Nim) ...

  9. 171230 编程-井字棋(逆)的先手必胜策略

    1625-5 王子昂 总结<2017年12月30日> [连续第456天总结] A. bambooctf-toddler-notakto-revenge B. ========== Welc ...

最新文章

  1. python 避免多重条件嵌套_如何避免多层嵌套函数
  2. jspServlet(2)
  3. js 字符串截取_【js】让你一次性搞清楚slice,substr,substring字符串截取函数
  4. 洛谷 P1414 又是毕业季II (多个数的最大公因数)
  5. 【转】URL编码(encodeURIComponent和decodeURIComponent)
  6. Linux 命令之 pstree -- 以树状图显示进程/查看进程信息
  7. linux桌面使用网卡设置,Linux的KDE桌面下怎样设置网络连接?
  8. k8s 和 Docker 到底是什么关系?
  9. [导入]New ASP.NET Charting Control: asp:chart runat=server/
  10. mysql数据库查询总条数
  11. 产品体验报告:百词斩————英语学习的领跑者
  12. 安卓短信软件_【安卓清理君】极度舒适的垃圾清理工具
  13. 共享充电宝之争:胜于专利,败于骂街 | 一点财经
  14. java web inf_JavaWeb - 访问 WEB-INF 资源几种方式
  15. STM32CubeMX快速生成STM32F407ZG芯片寄存器初始化
  16. 计算机三级在线题库,计算机三级网络技术题库(附答案)
  17. GBK与Big5之间如何做内码转换?
  18. 计算机网络工程和网络工程的区别,网络工程专业和计算机网络专业有什么区别?...
  19. 记录slow log相关的参数
  20. 西班牙语dele等级_西班牙语DELE考试分几个等级?难度如何 ?

热门文章

  1. 广州技能入户计算机证书,广州职称入户可以考哪些证书?推荐四种证书!
  2. 一个可以下载显示器调色icc文件的网站
  3. DXUT11框架浅析(1)--错误处理
  4. Net通用进销存管理系统 + 开发文档+ 使用说明
  5. Kaggle 自行车租赁预测比赛项目实现
  6. c语言指opt算法实现,Sunday算法c语言版实现
  7. Web端即时通讯之SSE
  8. 入侵某学校校园网过程
  9. While...Wend 语句
  10. 嘿嘿,我发现了百度网盘秒传的秘密 !!