Algorithm 如何找到修改后的Otherlo/reversi游戏的赢家?

Algorithm 如何找到修改后的Otherlo/reversi游戏的赢家?,algorithm,Algorithm,我在另一个网站上遇到了这个面试问题 在奥赛罗的游戏中,红色或黑色磁盘按照特定规则放置在8x8网格上。玩家选择自己的颜色,网格上磁盘数量最多的玩家获胜 给定两个2D阵列(一个为红色,另一个为黑色),表示存在/不存在磁盘,以及以下规则: 对于长度n>3的序列,指定(n-2)作为该玩家的点数 序列可以是垂直、水平或对角线 一个磁盘不能属于多个序列 e、 g.对于以下2D数组,点将是对角线元素(包括[0,0])和第一行元素(不包括[0,0])的最大值,或对角线元素(不包括[0,0])和水平元素(包括

我在另一个网站上遇到了这个面试问题

在奥赛罗的游戏中,红色或黑色磁盘按照特定规则放置在8x8网格上。玩家选择自己的颜色,网格上磁盘数量最多的玩家获胜

给定两个2D阵列(一个为红色,另一个为黑色),表示存在/不存在磁盘,以及以下规则:

  • 对于长度n>3的序列,指定(n-2)作为该玩家的点数
  • 序列可以是垂直、水平或对角线
  • 一个磁盘不能属于多个序列
e、 g.对于以下2D数组,点将是对角线元素(包括[0,0])和第一行元素(不包括[0,0])的最大值,或对角线元素(不包括[0,0])和水平元素(包括[0,0])的最大值。i、 e.max(4+0,3+2)=5

110
01 0 0 0 0
0 0 1 0 0 0
0 0 1 0 0
0 0 1 0
0 0 0 1


通过最高分数确定获胜者。

我有一个建议,尽管你可能会找到一个更简单的建议

要计算球员的得分,请a定位一个8X8 2D结构数组,该数组包含以下字段: 垂直、水平、对角线1、对角线2

在算法执行结束时,这四个字段将保存序列的大小“到目前为止”-例如,单元格(x,y)的“垂直”字段(如果该单元格中有一个磁盘)保存1,并且(x,y-1)中没有磁盘,如果(x,y)和(x,y-1)中有磁盘,则保存2,但(x,y-2)中没有磁盘,等等。其他三个字段的情况相同。 您还需要一个分数变量,以对所获得的分数求和

现在,您应该从(0,0)单元格[(0,0),(0,1)…(0,7),(1,0)…]开始,按升序逐行遍历此数组,并填充结构。在每个单元中,首先检查原始二维阵列的等效单元中是否有光盘。如果没有光盘,则应保留分数,并将当前单元格结构的所有字段设置为0。如果有一个磁盘(假设currnet单元格为(x,y)),则应按如下方式分配:

(x,y)->vertical = (x,y-1)->vertical,
(x,y)->horizontal = (x-1,y)->horizontal,
(x,y)->diagonal1 = (x-1,y-1)->diagonal1,
(x,y)->diagonal2 = (x+1,y-1)->diagonal2.
请注意,在每个点上,您需要的所有值都已计算出来。如果超出范围(x-1<0等),则该值为0。 您还应该为您分配的每个字段增加2分,或为您分配的每个字段增加1分(这将为长度n>3的每个序列提供n-2分)

就这些。通过所有2D阵列后,记分器将保存玩家的分数


复杂性是O(n^2),这一点都不坏(实际上,就复杂性而言,您找不到更好的解决方案)。

我有一个建议,尽管您可能会找到一个更简单的解决方案

要计算球员的得分,请a定位一个8X8 2D结构数组,该数组包含以下字段: 垂直、水平、对角线1、对角线2

在算法执行结束时,这四个字段将保存序列的大小“到目前为止”-例如,单元格(x,y)的“垂直”字段(如果该单元格中有一个磁盘)保存1,并且(x,y-1)中没有磁盘,如果(x,y)和(x,y-1)中有磁盘,则保存2,但(x,y-2)中没有磁盘,等等。其他三个字段的情况相同。 您还需要一个分数变量,以对所获得的分数求和

现在,您应该从(0,0)单元格[(0,0),(0,1)…(0,7),(1,0)…]开始,按升序逐行遍历此数组,并填充结构。在每个单元中,首先检查原始二维阵列的等效单元中是否有光盘。如果没有光盘,则应保留分数,并将当前单元格结构的所有字段设置为0。如果有一个磁盘(假设currnet单元格为(x,y)),则应按如下方式分配:

(x,y)->vertical = (x,y-1)->vertical,
(x,y)->horizontal = (x-1,y)->horizontal,
(x,y)->diagonal1 = (x-1,y-1)->diagonal1,
(x,y)->diagonal2 = (x+1,y-1)->diagonal2.
请注意,在每个点上,您需要的所有值都已计算出来。如果超出范围(x-1<0等),则该值为0。 您还应该为您分配的每个字段增加2分,或为您分配的每个字段增加1分(这将为长度n>3的每个序列提供n-2分)

就这些。通过所有2D阵列后,记分器将保存玩家的分数


复杂性为O(n^2),这一点也不坏(实际上,就复杂性而言,您找不到更好的解决方案)。

要了解规则,请尝试此链接

使用的数据结构:

委员会:int[8][8];

未计数红色:2,未计数黑色:-2,空:0

计数红色:1,计数黑色:-1

红色分数:int,黑色分数:int


算法:

  • 查找长度大于3的连续红色序列

  • 对于找到的每个序列,添加分数长度-2

  • 通过在序列中遇到的已计数的PEG进一步降低分数

  • 在计算分数后,所有未计数的桩均已计数

  • 对黑色重复此过程

  • 赢家=得分\红色>得分\黑色?红色:黑色



  • 现在问题归结为如何执行步骤1

    要了解规则,请尝试此链接

    使用的数据结构:

    委员会:int[8][8];

    未计数红色:2,未计数黑色:-2,空:0

    计数红色:1,计数黑色:-1

    红色分数:int,黑色分数:int


    算法:

  • 查找长度大于3的连续红色序列

  • 对于找到的每个序列,添加分数长度-2

  • 通过在序列中遇到的已计数的PEG进一步降低分数

  • 在计算分数后,所有未计数的桩均已计数

  • 对黑色重复此过程

  • 赢家=得分\红色>得分\黑色?红色:黑色



  • 现在问题归结为如何执行步骤1

    创建二维结构阵列后,如何选择要添加到分数中的组件(diag、vert、hor)?我们将如何处理[0,0]处的元素