前言

最近我在玩一个很有意思的游戏,叫“圈小猫游戏”。我觉得这个问题和数学有很大的关系,可以通过数学的方法对这个游戏进行研究。这个游戏的网址是:https://www.6soluo.com/cat/。大家有兴趣也可以玩玩看。
后来我发现,早在1982年,英国数学家约翰·何顿·康威提出了一个博弈论问题——天使问题,这个问题和圈小猫游戏有高度的相似性。
我在研究这两个相似度极高的问题时,提出了一个理论——容错值理论。现在把这个理论介绍给大家。

圈小猫游戏

规则介绍

在一个11*11的接近正方形的棋盘上,每个格子按照六边形规则排列(即每个内部的格子都与六个格子相邻)。棋盘上会随机放置8个障碍物。在棋盘的正中央,有一只小猫。小猫的目的是从棋盘逃出去,而玩家的目的是通过放置障碍物,阻止小猫逃出去。每一轮,玩家和小猫交替进行,玩家可以在空格子中放置一个障碍物,小猫会往相邻的格子中走一格。玩家先手。若小猫走到棋盘边缘,则小猫获胜;若障碍物形成一个闭环,让小猫无法出去,则玩家获胜。

上面这幅图是围小猫游戏的一个抽象模型。0表示一个格子,#表示小猫所在的位置。后面会对这个模型进行研究。

问题分析

既然玩家想要获胜,就要充分利用初始的8个障碍物,找到一个闭环,把小猫围起来。在这个特定的棋盘上,这个闭环显然应该是一个多边形。那么我们对于这个问题的研究就转变为对这个多边形的研究。研究这个多边形之前,需要大致了解猫的行走思路,所以我们对猫的行走思路提出一些假设。

假设条件

小猫由程序控制,它会选择一条里棋盘边缘最近的路线出逃。这里假设它是一只正常的小猫,不是太蠢,也不会太聪明,起码它不懂博弈论。为了简化问题,方便研究,我们先给定一些假设条件,后面再慢慢把假设条件去掉,趋于真实情况。
假设1:我们知道猫的第一步会怎么走。
假设2:猫的行动路线为:先按照最短距离到达一条我们想围的边,再一直沿着这条边走。
假设3:在猫到达第一条边后,我们知道它的行走方向,即知道它会顺时针沿着我们的边走,还是逆时针沿着我们的边走。
假设4:猫会严格沿着边走。
如果我们已经找到了一个能围住小猫的多边形,那么把这四个假设连起来,我们就可以确定小猫的行走路线:它先按某个已知的方向,沿最短路径走到第一条边(布防线),然后沿已知的方向(顺时针或逆时针)绕着这个多边形走一圈,直到我们刚好把这个多边形封闭为止。

名词定义

为了解决这个问题,我们需要引入一些新的概念。为方便大家的理解,在这些名词的选取上,我尽量选取了那些可以望文生义的词语。其实有些词语的含义很显然,但是为了严谨起见,还是一一介绍一下。

布防线

在假设3中,猫到的第一条多边形的边称为布防线。

距离

点与点的距离指的是从一个点到另一个点,小猫最少要走几步才能到。
小猫到一个点的距离,是指小猫所在的点与另一个点之间的距离。
点与边的距离指的是从这个点到边上的所有点的最短距离。
小猫到某一条边的距离,指的是小猫到这条边上的所有点的最短距离。

一个多边形是由点和边构成的,我们先来把各种点分个类。由于多边形外面的点对我们的研究不产生影响,故我们只研究边上的点和边内的点。

顶点与凹点

边与边的交点中,内角小于180度的,称为顶点;内角大于180度的,称为凹点。
在研究时,顶点是一类非常重要的点,而凹点则是一类非常麻烦的点。

边角点

在多边形的边上,且与顶点距离为1的点称为边角点。
在后面的研究中,我们会发现边角点有着和顶点非常相似的性质,甚至有时可以代替顶点。

边点

边上除了顶点、凹点和边角点之外的点,就叫边点。边点就是位于边上的普通点。

环内点

在多边形内部的点,称为环内点。
对于环内点的研究比较复杂,本文只研究一些比较简单的环内点。

狭义半径与广义半径

为了研究这个多边形,我们引入半径这个概念。狭义半径指小猫到这个多边形的所有边的距离的最小值。在三个假设条件下,猫是会先到达第一条边,再沿着我们围出的边界走。那么其实我们只需要知道猫到第一条边的距离就行了。于是我们引入广义半径。广义半径指猫到第一条边的距离。
广义半径是建立在假设1和假设2之下的。如果去掉假设,研究一般情况的话,我们就用狭义半径来替代广义半径。此处需要说明的是,后文把狭义半径和广义半径都成为半径,具体采用哪一种半径主要取决于是否采用假设条件。
我们用R来表示半径。

最短布防距离

按照我们的假设,猫会先到达布防线,我们来研究在没有初始点的情况下,猫从初始位置到布防线这一段过程。由于棋盘的对称性,我们不妨假设布防线是位于小猫的正下方的某一条水平线的一部分。
当这条水平线与小猫距离为1时,小猫只需要一步就能到达这条边,然后可以轻松地逃出去。
当这条水平线与小猫距离为2时:

#表示小猫的位置,奇数表示玩家的走法,偶数表示小猫的走法。因为玩家先手,所以玩家从1开始。从图中可以看出,只要按照这种方法,小猫永远不可能从这条边逃出去。这种方法表明,只要小猫距离你的布防线距离为2,你就可以通过这种方式阻止小猫从这条边逃出去。
我们令d表示最短布防距离,那么在以六边形规则排列的棋盘中,d=2。

容错值

容错值是本理论的核心内容,可以说,你理解了容错值,就理解了这一套理论。
容错值的含义是在某一时刻下,你让小猫多走a步,小猫仍然不会从离它最近的边逃出去,那么容错值就为a。容错值的本意是允许你犯错几次,但我们在研究问题时不会考虑人为失误,所以在这里,容错值也可以理解为你领先小猫的步数。

容错值序列

容错值的具体数值是根据小猫走的步数而变化的,即小猫每走一步,容错值都可能会发生变化。所以容错值不应该仅仅是一个值,而应该是由每个时刻的容错值构成的一个数列。我们用{an}\{a_n\}{an​}来表示这个数列。
定义完容错值序列之后,我们来看看这个序列和这个游戏的获胜条件之间的关联。
从定义中可以看出,容错值序列是一个与多边形和小猫的行走路径有关系的一个数列。根据我们的四条假设,对于一个多边形,其实小猫的路线是完全确定的。所以我们的容错值序列主要取决于多边形的性质。
根据定义可以看出,若{an}\{a_n\}{an​}恒为非负,则小猫始终逃不出去,就被我们围住了。即一个多边形能围住小猫的必要条件是{an}\{a_n\}{an​}恒为非负。
后面我们会证明,其实这个条件也是充分的。也即一个多边形能围住小猫等价于容错值序列非负。所以我们接下来要重点研究容错值的计算问题。如果对于一个多边形,我们能把它所对应的容错值序列求出来,那么我们就能判断这个多边形是否是问题的解,即这个多边形是否能围住小猫。

边界容错值

我们先不考虑棋盘上的初始点,研究小猫围着我们的边界行走的情况。
按照假设,小猫我们知道小猫的第一步会怎么走,假设它会走到2这个位置,那么我们按照下图所示去围它。

我们发现,当小猫到达3-1-5这条线的时候,我们每走错一步,小猫都会逃出去,所以这个时候的容错值为0。而我们只要一直沿着这条线去堵,小猫就不会从这条边逃出去。也就是说,当小猫围着边行走的时候,容错值不会变化。
但是,棋盘是有限的,若小猫一直沿着这条线走下去,很快就会走出棋盘,所以一定得拐弯。当小猫走到6的时候,若我们走“?”这一步,则小猫会沿着这条线走下去,根本不会拐弯;而若我们走7这一步,小猫就能走到“?”的位置,从而逃出我们的包围圈。而如果这个时候我们能多下一步,既下在“?”的位置,又下在7的位置,我们就能成功达到拐弯的效果,让小猫往“?”-7这个方向走了。所以当小猫走到6的时候,容错值为-1。也就是当小猫周围有顶点时,容错值减一。换句话说,也就是空顶点的容错值为-1。
当小猫沿着边点走时,容错值不变化;当小猫走到顶点时,容错值会-1。我们可以定义一个函数来描述这种容错值的变化。
p(i)={0小猫走到第i步时,周围没有顶点1小猫走到第i步时,周围有顶点p(i)=\begin{cases} 0 & 小猫走到第i步时,周围没有顶点 \\ 1 & 小猫走到第i步时,周围有顶点 \end{cases}p(i)={01​小猫走到第i步时,周围没有顶点小猫走到第i步时,周围有顶点​

某时刻的容错值

既然一个空格子的容错值改变量可以用p(i)p(i)p(i)这个函数来描述,那么一个有障碍物的格子的容错值可不可以用一个函数来描述呢?我们用q(i)q(i)q(i)表示当小猫走到第i步时,前进方向上的周围的初始点所造成的容错值增量之和。至于这个函数具体怎么计算,我们将在后面详细讨论。
定义完p(i)p(i)p(i)和q(i)q(i)q(i)之后,我们可以就给出某时刻的容错值公式:
an=an−1−p(n)+q(n)a_n=a_{n-1}-p(n)+q(n)an​=an−1​−p(n)+q(n)
n表示小猫走到了第n步。
解释一下这个公式,这一时刻的容错值,应该在上一时刻容错值的基础上,减去空格子带来的容错值改变量,加上有障碍物的格子带来的容错值改变量。

初始容错值

某时刻的容错值公式an=an−1−p(n)+q(n)a_n=a_{n-1}-p(n)+q(n)an​=an−1​−p(n)+q(n)是个递推式,那么要确定这个数列的值,肯定得先知道第一个元素的值,即我们希望知道a0a_0a0​的值。a0a_0a0​的意义是小猫走0步时的容错值,就是初始容错值。我们给出以下公式:
a0=R−da_0=R-da0​=R−d
R表示多边形的半径,在假设条件下,取广义半径。d表示最短布防距离。由于在本问题中,d=2,所以,初始容错值公式也可以写成:
a0=R−2a_0=R-2a0​=R−2
接下来证明一下这个公式。由于初始点(初始障碍物)只会影响某时刻的容错值以及我们想要围成的多边形,所以初始容错值应该与初始点无关。于是我们假设棋盘上一个初始点也没有。初始容错值表示我们一开始领先小猫的步数,我们不妨让小猫先走a0a_0a0​步,那么此时我们我们恰好能围住小猫。这时它离我们的布防线距离为R−a0R-a_0R−a0​。若R−a0<dR-a_0<dR−a0​<d,那么小猫可以轻易从我们的布防线逃脱;若R−a0>dR-a_0>dR−a0​>d,那么我们再让小猫多走一步,我们依然不会让它从这条边逃脱。所以R−a0=dR-a_0=dR−a0​=d,即a0=R−da_0=R-da0​=R−d。

广义六边形

我们先来研究一下这个多边形的形状。

假设我们现在有一条边(就是图中由一排1围成的边),并且假设这条边要在红色的1的地方拐弯。在这个红色的1旁边有六个点,要拐弯的话,就只需要考虑2、3、5、6这四个点。先来看2,如果往2这边连的话,这个角就是锐角。但其实如果把这个红色的1去掉,红色的1左边的1和2形成了一个钝角,那么这个钝角的两条边已经足够可以围住小猫了,这个红色的1就是一个多余的点。既然有多余的点,那么这个多边形一定不是最优的。换个说法,即使红色的1已经存在了,我们也可以忽略掉这个锐角,而看成一个钝角。所以如果要找一个多边形的话,这个多边形的所以角都不可能是锐角。6这个点同理。
那么就只剩下3和5两个点了。3和5分别代表了这个拐弯的地方角度为120度和240度的情况。转角为120度是我们比较熟悉的情况,接下来着重来看转角为240度的情况。

这张图是一个八边形。可以看出,除了1和2所连成的角度是240度,其它角的角度都是120度。红色的2是一个凹点,与红色的2直接相连的两条边,称为凹边。在前面的研究中,我们已经知道一个顶点会带来容错值-1的结果,那么这样一条凹边和凹点会对容错值产生什么影响呢?让我们来模拟一下。

根据之前的讨论,绿色的顶点对容错值的影响为-1。现在假设猫已经通过绿色的点,位于凹边的第一段旁边(#的位置)。通过模拟,我们发现,在猫经过凹点(红色的点)和凹点后的第一个点(紫色的点)时,容错值没有发生变化,始终为0。这条凹边由绿点-红点-紫点构成,猫在经过凹边的时候,容错值的改变只发生在这条凹边中,小猫先到达的那个顶点处。于是,我们可以把红点和紫点看成是普通的边点。为了处理方便起见,我们可以把绿点-红点这条边延长至与下面那条边相交,如下图:

这样就构造了一个六边形,这个六边形在顶点和边的性质上和原来的凹多边形非常相似。这一步只需要在思想上延拓。那么既然每一个凹多边形都能通过这种方法延拓为一个性质基本不变的的六边形,于是我们我们就把这样的凹多边形也纳入六边形中来,我们称之为广义六边形。广义六边形包括普通六边形和凹多边形。
所以,我们要找的能把小猫围起来的图形,就是广义六边形。
由于我们所围成的多边形一定是一个广义六边形,所以可以得到一个重要的公式:∑i=1np(i)=6\sum_{i=1}^{n}{p(i)}=6i=1∑n​p(i)=6

潜在容错值

我们现在已经可以知道了初始容错值a0=R−da_0=R-da0​=R−d,也知道了数列的递推公式an=an−1−p(n)+q(n)a_n=a_{n-1}-p(n)+q(n)an​=an−1​−p(n)+q(n),同时也知道了p(n)p(n)p(n),那么只要再知道q(n)q(n)q(n),我们就能确定容错值序列了。所以现在问题变成了对q(n)q(n)q(n)的研究。q(n)q(n)q(n)表示小猫走到第n步时,前进方向上的周围的初始点对小猫带来的容错值之和。由于这些容错值并不是一开始就表现出来的,是要等小猫走到那个位置才能对容错值产生影响,所以q(n)q(n)q(n)也被我们称为潜在容错值。小猫走到我们的第一条边之后,有两种走法,一种是沿顺时针走的,一种是沿逆时针走的,这两种走法的容错值序列是不一样的。所以这个容错值序列不仅与广义六边形的形状有关,也与小猫走的方向有关。但是根据我们的假设,我们已经知道了小猫的行走方向,所以容错值序列是基本上可以确定的。接下来我们来研究一些具体情况,看看不同类型的点带来的容错值变化是怎么样的。

顶点


黑色的#表示猫现在的位置,红色的#表示在顶点处有一个初始点。假设现在猫会逆时针绕着我们的广义六边形走,现在容错值为0。从图中可以看出,在这一段,容错值始终为0,即在这一段上,p(i)=q(i)p(i)=q(i)p(i)=q(i)。而当小猫走到4的位置时,p(i)=1p(i)=1p(i)=1,所以此时q(i)q(i)q(i)也等于1。所以顶点带来的容错值的改变就在于小猫走到拐角处时,使容错值+1。

边点


从图中可以看出,当小猫走到4的位置时,容错值+1。所以边点的作用就是当小猫经过这个点的时候,使容错值+1。

边角点

边角点可以看成是一种特殊的边点,所以此时边角点和边点的作用一样,在这里不做单独讨论。

环内点


我们先来看一类比较简单的环内点,稍微复杂一些的我们在后面再讨论。如图,红色的#是一个与我们要围的这一条边距离为1的一个点,且与之相邻的在边上的点都是边点。那么这个时候这个点的阻挡作用就相当于让猫本来走2-#-8这个2步就能走完的路线按2-4-6-8的走法走了3步,就是让猫多走了一步。这个效果是当猫走到2的时候就生效的,所以这一类环内点的效果就是让猫走到它前面的时候,使容错值+1。

潜在容错值公式

通过对于几类初始点位置的探讨,我们对q(i)q(i)q(i)的取值有了初步的刻画。我们得出了潜在容错值公式:
q(i)={k小猫走到第i步时,前进方向上有阻挡的初始点1小猫走到第i步时,前进方向的边上有初始点0其它情况q(i)=\begin{cases} k & 小猫走到第i步时,前进方向上有阻挡的初始点 \\ 1 & 小猫走到第i步时,前进方向的边上有初始点 \\ 0 & 其它情况 \end{cases}q(i)=⎩⎪⎨⎪⎧​k10​小猫走到第i步时,前进方向上有阻挡的初始点小猫走到第i步时,前进方向的边上有初始点其它情况​
k表示这个阻挡的点对小猫的阻挡效果。比如,我们上面讨论的那一类与边距离为1且与之相邻的点都是边点的环内点,它对应的k=1。

判断广义六边形是否可行的充要条件

先给出结论。在我们的四个假设之下,判断一个广义六边形是否能围住猫的充要条件为沿猫走的方向的容错值序列恒为非负。
先来证明必要性。即从广义六边形能围住猫推出容错值序列恒为非负。运用反证法。假设这个广义六边形对应的容错值序列在某个时刻为负,那么根据容错值的定义,小猫在这个时刻就领先我们了。既然领先我们,就说明它一定有办法逃出去。故这个广义六边形围不住猫,矛盾!所以若一个广义六边形能围住猫,这个方向的容错值序列一定恒为非负。
再来证明充分性。即从容错值序列恒为非负推出这个广义六边形能围住猫。这个广义六边形目前只存在于我们的脑海中,需要通过在棋盘上设置障碍物来实现这个广义六边形。证明充分性,也就是要构造一种一定能围住猫的设置障碍物的方法。根据我们的假设,猫的行动路线是可以完全确定的,那么很简单,我们根本不用理会猫怎么走,只需要按照它走的方向,按照我们脑海中的广义六边形,一步一步围起来就好了。因为我们的容错值序列非负,所以按照这样的方式围,小猫一定逃不出去。
通过以上证明,我们证明了在四个假设条件之下,问题可以完全转化为对容错值序列的计算,而容错值序列的计算公式我们也已经得出:
{a0=R−dan=an−1−p(n)+q(n)p(i)={0小猫走到第i步时,周围没有顶点1小猫走到第i步时,周围有顶点q(i)={k小猫走到第i步时,前进方向上有阻挡的初始点1小猫走到第i步时,前进方向的边上有初始点0其它情况\begin{cases} a_0=R-d \\ a_n=a_{n-1}-p(n)+q(n) \\ p(i)=\begin{cases} 0 & 小猫走到第i步时,周围没有顶点 \\ 1 & 小猫走到第i步时,周围有顶点 \end{cases} \\ q(i)=\begin{cases} k & 小猫走到第i步时,前进方向上有阻挡的初始点 \\ 1 & 小猫走到第i步时,前进方向的边上有初始点 \\ 0 & 其它情况 \end{cases} \end{cases}⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​a0​=R−dan​=an−1​−p(n)+q(n)p(i)={01​小猫走到第i步时,周围没有顶点小猫走到第i步时,周围有顶点​q(i)=⎩⎪⎨⎪⎧​k10​小猫走到第i步时,前进方向上有阻挡的初始点小猫走到第i步时,前进方向的边上有初始点其它情况​​
所以在我们的四个假设条件下,这个问题已经基本解决了。我们只需要根据棋盘上的已知初始点,在脑海中想象一个能更多地利用初始点,达到容错值最大化的广义六边形,只要其容错值序列恒为非负,这个广义六边形就是问题的解,我们只需要一步一步去实现就行了。

对假设条件的探讨

当然,小猫的实际行走路线不可能如此理想化,不可能完全按照我们的四个假设条件来。所以为了贴近真实情况,我们需要把这些假设条件一条一条去掉。

假设1

假设1是假设我们知道猫的第一步怎么走。
其实,猫的第一步怎么走,仅仅关系到它是先到达哪一条边,它到这条边的距离是多少。所以如果去掉这个假设,我们需要考虑猫往每个方向走的情况。而最坏情况就是猫会走你广义六边形中距离它最近的这条边,所以此时广义半径就应该用狭义半径来替换,从而得到一个新的a0a_0a0​。
而其实你要知道猫的第一步怎么走,你也可以先让猫走一步。所以你可以把第一步下在一个比较好的点,让猫走一步,这样你就知道它会先到达你的哪一条边了。

假设2

假设2是假设猫会先沿最短距离到达我们的第一条边(布防线),再沿着这条边走。
这条假设其实是比较合理,也比较贴近真实情况的。因为猫既然第一步选择了这么走,肯定是希望从这个方向逃出去,如果它中途换一个方向逃,其实就浪费了几步。而它到达我们的第一条边后,自然而然会希望从这条边逃出去,如果换一条边逃出去的话,可能需要多走很多步。而如果猫多走很多步,情况就会大大利于我们了。所以这条假设还是比较合理的。

假设3

假设3是假设猫在到达第一条边后,我们知道它会往哪个方向走。
除了一些特殊情况,我们可能可以诱导猫往我们希望的方向走;大多数情况,我们其实是不能预知它会顺时针走还是会逆时针走。但是没关系,我们可以解决这种情况。在猫走出第一步之后,我们可以计算猫走到第一条边后沿顺时针走的容错值序列和沿逆时针走的容错值序列。我们把两个方向的容错值序列都算出来,若均为非负,那么说明你构思的广义六边形可以围住猫。

假设4

假设4是假设猫会一直严格沿着你的广义六边形边界走。
这个假设其实在很大程度上也是符合实际情况的,只有一些比较特殊的情况,猫既不犯傻,又不严格沿着边界走。比如下图的情况:

黑色的#表示小猫现在的位置,红色的#表示这个地方有一个初始点。按照之前的讨论,这个初始点会使容错值+1,而经过顶点时容错值会-1。所以若小猫严格沿着边界走,容错值始终为0,那么我们可以围住它。但是在图中,小猫绕过我们的障碍物,就不想继续往这条边走了,因为它觉得往另外一条边走可以更快逃出去。所以这样的话,如果我们一直沿着这条边落子(按照图上的方式落子),那么可以看到,小猫的下一步就能从边界逃出去了。所以这时我们就不能按照老方法,不管小猫的行走路径,只顾按顺序围自己的边。这时我们可以机灵一点,灵活应对。下图时一种应对方式。

一般来说,落子优先顺序为:边角点>顶点>边点。所以我们优先落子边角点3和5。这样一来,就能把小猫围住了。如果围得好的话,像图中的情况,我们不仅不会让小猫逃出去,还能领先它一步,使容错值+1。

具体情况下广义六边形的构造

根据以上对于假设条件的讨论,其实我们已经很接近真实情况了。所以现在最大的问题,就变成了如何更好地利用初始点,构造我们的广义六边形。接下来我们再对一些具体情况进行具体地分析。
(待更新)

理想条件下的探讨

既然在有限大小的平面上,给定一些初始点,可能能找到这样的广义六边形围住小猫。那么在无限大的平面上,不给初始点,是否存在一种广义六边形,对于小猫的任意走法,小猫都不可能逃出去。这个问题是否有解?如果有解,那么这个平面需要多大?
简化一下问题,假设找一个正六边形边界围住小猫,那么这个正六边形的半径最小是多少呢?
答案是8。
我们先来证明存在一种方法,猫可以逃出半径为7的正六边形。既然我们只是要找到一种方法,不妨给定这只猫本文开始提出的4个假设。那么a0=7−2=5a_0=7-2=5a0​=7−2=5。因为猫每拐一次弯,容错值就-1,而这只猫需要拐6次弯,所以到最后一个弯的时候,容错为-1。根据在4个假设条件下,判定广义六边形是否可以围住小猫的充要条件,我们知道容错值序列需要恒为非负。既然在小猫的这种走法下,容错值可以达到-1,就说明小猫按照我们4个假设条件走的路径可以逃出去。所以7不是问题的解,问题的解一定大于7。
我们再来证明我们有一种围半径为8的六边形的方式,无论如何,猫都逃不出去。我们构造一个关于小猫的初始位置对称的正六边形。先让猫任意走6步,我们把这个正六边形的6个顶点给围了。这样我们就把顶点会产生负的容错值全部抵消掉了。然后这只猫距离我们最近的那条边的距离一定大于等于2。然后我们的策略如下:只要猫到达布防距离,我们就对那条边开始布防。这样猫肯定逃不出这条边。若猫沿着这条边走,那么由于我们已经把负的容错值抵消掉了,所以容错值不会变化。所以只要猫沿着这条边走,肯定逃不出去。若猫不沿这条边走,换一种走法,那么只要它离一条边的距离等于2,我们就布防。在这种策略下,猫就不可能从任何一条边逃出去。现在我们来考虑一种极其特殊的情况:

假设小猫已经走了6步,我们也已经把6个顶点给围住了。如果小猫直直地朝着其中一个顶点走,那么它就有可能同时和两条边距离为2。那么不管我们布防哪一条边,它都可以从另外一条边逃出去。那么根据点的性质,边角点的性质比顶点的性质好,我们可以在选择6个初始点的时候,不采用顶点,而采用按同一方向走一格的边角点。

顶点是红色的0,但我们不在这里放置障碍物,而在红色的#处放置障碍物,这样就算小猫沿着对角线往顶点走,我们也能围住它。而由于考虑容错值时,边角点和顶点完全一样,所以对于所有情况,这种落子方法一定可以围住小猫。
综上,我们证明了7及以下的正六边形不可能是解,而我们找到了半径为8的解。所以只要半径为8的正六边形,就能围住小猫。

天使问题

规则介绍

1.有两名玩家参与游戏, 两名玩家分别扮演天使和恶魔。
2.游戏开始时, 指定一个正整数 K,称之为天使的力量 。
3.游戏在一个无限大的方格棋盘上进行;开始时棋盘是空的,天使停留在棋盘上的某一个 (称为天使的起始点),恶魔并不存在于棋盘上 。
4.每一轮中, 恶魔可以在棋盘上放置一个路障,路障不可以放置在天使停留处
5.每一轮中,天使可以向相邻格移动至多 K 步, 移动过程中可以穿过路障,但移动终点必须停留在没有路障的格中; 纵横斜格均算作相邻格。
6.从恶魔开始,双方交替进行 (若从天使开始, 从上面的规则描述,亦可等价转换为从恶魔开始的局面)。
7.若在一轮中,天使无法移动,则恶魔获胜。
8.如果天使能够无限地继续游戏,则天使获胜。

一阶天使问题

高阶天使问题

(待更新)

圈小猫游戏与天使问题——容错值理论相关推荐

  1. javascript小游戏_个人网站集成js小游戏《圈小猫》教程及源码

    今天在某网站浏览帖子的时候,发现帖子被删除了,然后弹出了404页面,页面上集成了一个小游戏,小游戏长什么样子呢?看下面这个图! 第一步 查看小游戏源码,发现这个小游戏完全是由JavaScript编写的 ...

  2. MODE —— 两个人在计算机上玩圈叉游戏|井字游戏(知识点:二维数组)

    问题描述: 让两个人在计算机上玩井字游戏(也称圈叉游戏). 井字游戏就是一个3X3的方格,两个人轮流在方格中输入标记X 或者 O .谁先使自己的3个标记链接成水平,垂直或对角线.谁就是赢家. 运行结果 ...

  3. LYVC揭秘硅谷核心基金圈投资游戏规则

    本文讲的是LYVC揭秘硅谷核心基金圈投资游戏规则[IT168 资讯]从最早期的半导体企业,到Intel.苹果等巨头首次展露锋芒,再到2000年的互联网泡沫破灭,随着经济与科技形势不断起伏,硅谷风险投资 ...

  4. 圈叉游戏 java_【炫光圈叉棋】炫光圈叉棋 Tic Tac Toe Glow 1.8.1下载_安卓(android)软件下载-魅族溜...

    一款炫光风格的圈叉棋游戏,支持单/双人模式.圈叉棋,英文:tic-tac-toe,别名:圈叉游戏.是一种游戏,3*3的9个方格子,先下者画圈,后下者画叉,每人可以在任意没有对方棋子的封闭方格里下一次, ...

  5. 如何用C语言实现圈叉游戏(-)

    今天情人节,还是在学习C语言 自己写了一遍发现自己写的没有书上的代码更简练 就把书上的代码稍微修改了一下 下面看游戏界面 和昨天的米字棋差不多,有时间会结合米字旗的代码做些修改 上代码: /*井字游戏 ...

  6. c语言画叉,如何用C语言实现圈叉游戏(-)

    今天情人节,还是在学习C语言 自己写了一遍发现自己写的没有书上的代码更简练 就把书上的代码稍微修改了一下 下面看游戏界面 和昨天的米字棋差不多,有时间会结合米字旗的代码做些修改 上代码: /* 井字游 ...

  7. 机器学习模型可解释性进行到底 —— SHAP值理论(一)

    最近在系统性的学习AUTOML一些细节,本篇单纯从实现与解读的角度入手, 因为最近SHAP版本与之前的调用方式有蛮多差异,就从新版本出发,进行解读. 不会过多解读SHAP值理论部分,相关理论可参考: ...

  8. 因果推断杂记——因果推断与线性回归、SHAP值理论的关系(十九)

    文章目录 1 因果推断与线性回归的关系 1.1 DML的启发 1.2 特殊的离散回归 = 因果? 2 因果推断中的ITE 与SHAP值理论的思考 2.1 一些奇思妙想 2.2 因果推断 -> s ...

  9. 聊聊P6赢得值理论的运用

    在对项目当前执行状况进行分析以及对项目成本发展趋势进行预测时,项目经理经常会遇到一些非常困惑的问题:如何评价项目当前的执行情况?未来项目到底能不能实现盈利?由于变更的大量出现,造成项目目标经常需要作出 ...

  10. 浅谈赢得值理论的运用-Oracle p6

    在对项目当前执行状况进行分析以及对项目成本发展趋势进行预测时,项目经理经常会遇到一些非常困惑的问题:如何评价项目当前的执行情况?未来项目到底能不能实现盈利?由于变更的大量出现,造成项目目标经常需要作出 ...

最新文章

  1. 微软亚洲研究院成立OpenNetLab,探索以“数据为中心”AI网络研究新范式!
  2. LR学习笔记三 之 界面分析
  3. R语言编程艺术#01#数据类型向量(vector)
  4. intext:企业_企业中的微服务:敌是友?
  5. android搜索功能xml,Android_Android ActionBar搜索功能用法详解,本文实例讲述了Android ActionBar - phpStudy...
  6. tensorflow中的Supervisor
  7. Linux下Vim工具常用命令
  8. Qt creator5.7 OpenCV249之图片灰度处理(含源码下载)
  9. DBNull与Null的区别
  10. svn 中的url路径修改和 清除 svn用户名和密码
  11. 汽车电子技术——CAN总线系统
  12. Spring之Bean作用域
  13. LM393(寻迹原理)
  14. QCOM chi-camera bring up
  15. 识别IOS和android方法
  16. Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)
  17. Android WebRTC 入门教程(一) -- 使用相机
  18. 基于用户的音乐推荐平台
  19. [牛客练习] 深信服校园招聘c/c 软件开发H卷 Apare_xzc
  20. 快速高效 | iOS银行卡识别

热门文章

  1. c语言写32位编译器,MinGW32 GCC编译器 V8.1 32位免费版
  2. JS点击图片位置后增加点位
  3. 企业微信小程序(企业内部)怎么自定义工作台和通过中文名模糊查询到员工的个人信息和userid
  4. 计算机发展简史ppt,计算机发展简史ppt
  5. 指纹识别算法MZFinger5.0
  6. matlab powergui的作用,powergui模块作用
  7. 微信小程序引入UI组件库
  8. 空调冷凝水管径选用原则
  9. 单盘齿廓测量仪的设计
  10. ScreenToGif2.19.3中文版GIF录制工具