Sprague–Grundy定理/尼姆游戏/ Bowlingpins Hackerrank

问题描述

我一直试图在HackerRank中解决这个问题,称为保龄球瓶。基本上,您必须编写一个程序来预测谁会赢,谁会输。游戏规则是:

  • 保龄球瓶水平放置,并用一串大写字母i表示->“ IIII”(4个针脚)
  • 您可以击倒一个单独的“ I”引脚或两个相邻的“ II”引脚
  • “ X”将代表被击倒的引脚
  • 最后一位击败胜利者

给出字符串“ XIIX”,这是一次胜利,因为我可以击倒两个中间的针脚。

给定字符串“ IXIX”是失败的,因为下一位玩家将采取最后的行动

现在,我试图对组合游戏定理有一个基本的了解。我知道我必须计算出混合比和脾气暴躁,才能在不实际玩游戏的情况下知道谁赢了谁,谁输了。

现在我的问题是我是否有三个“ III”引脚 mex {1,2} = 0,这意味着失败。但是,当我按下单个中间销时会发生什么? 下一个玩家回合将看起来像“ IXI”,无论我得到最后一个销子并获胜,他/她都可以按下左销或右销。对吧?

我对这些概念还很陌生,我不确定我是否为该游戏正确实现了Sprague-Grundy定理。有人可以向我解释吗?

以下是我要解决的问题的链接-> https://www.hackerrank.com/challenges/bowling-pins/problem

解决方法

我认为该文档对相关理论https://web.mit.edu/sp.268/www/nim.pdf有很好的解释。就个人而言,我花了一些时间来阅读这份文件。起初我只是尝试阅读,但是通过写下一些引理/定理并自己进行一些练习,我从中获得了更多的收获。我认为“从游戏到图形”和“ Sprague-Grundy函数”部分下的图形对于解决此问题特别有用。

这是我开始思考的方式:一组大头针就是游戏位置。每个游戏位置都可以是终端,也可以有跟随者,而跟随者是可以移动到的其他游戏位置。可以根据其关注者的SG值为每个游戏位置分配一个Sprague-Grundy(SG)。现在尝试创建游戏位置图:

  • 唯一的端子位置是没有剩余的引脚,根据您开始使用的引脚数,我们可以将其写为XXX或许多X。这个职位有SG(X) = 0,因为它是终点站。

  • 游戏位置I可能会撞到一个针脚,这会使其变成X。因此XISG(I) = mex{SG(X)} = mex{0} = 1

    的关注者
  • 游戏位置II可以撞倒一个针,使其变为XI == IX == I,或者两个,使其{ {1}} == XX。因此,它具有这两个关注者和X

  • 现在让我们看一下SG(II) = mex{SG(I),SG(X)} = mex{0,1} = 2,因为这是我们开始使用文档中其他信息的地方。追随者是III(SG为2),XII(SG为1)和XXI。对于这最后一个,我们可以看到它只有一个跟随者并得到这样的SG,或者我们可以使用Sprague-Grundy定理。这表示“图形上游戏总和的SG函数就是其组件SG函数的Nim总和”。对于IXI,它有两个IXI的游戏,每个游戏的SG为1。当我们获得nim和(即二进制表示的异或)时,我们得到0。因此,总之,I

您可以一次又一次拿走1或2 SG(III) = mex{2,1,0} = 3并计算nim的总和,以自下而上获得其他SG。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...