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

时间:2012-04-14 15:35:05

标签: algorithm

我在另一个网站上看到了这个采访问题。

在奥赛罗的游戏中,红色或黑色磁盘按照某些规则放置在8x8网格上。玩家选择他们的颜色,并且网格上具有最大磁盘数的玩家获胜。

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

  • 对于长度为n的序列> 3,将(n-2)指定为该玩家的分数
  • 序列可以是垂直,水平或对角线
  • 磁盘不能属于多个序列

e.g。对于下面的2D数组,这些点将是对角元素(包括[0,0])和第一行中的元素(不包括[0,0])或对角元素(不包括[0, 0])和水平元素(包括[0,0])。即max(4 + 0,3 + 2)= 5

1 1 1 1 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1

以最高分数确定获胜者。

2 个答案:

答案 0 :(得分:0)

我有一个建议,即使你可能会找到一个更简单的建议。

要计算玩家的分数,请分配8X8 2D结构阵列,其中包含以下字段: 垂直,水平,对角线1,对角线2。

在算法执行结束时,这四个字段将保持序列的大小“到目前为止” - 例如,如果此单元格中有光盘,则单元格(x,y)的“垂直”字段保持为1如果在(x,y)和(x,y-1)处有光盘但在(x,y-2)处没有光盘,则在(x,y-1),2处没有光盘。相同关于其他3个领域。 您还需要一个分数变量,以对达到的分数求和。

现在你应该按行按升序顺序遍历这个数组,从(0,0)单元格[(0,0),(0,1)....(0,7),(1)开始,0)......],并填写结构。在每个单元格中,首先检查原始2D阵列的等效单元格上是否有光盘。如果没有光盘,则应保留分数,并将当前单元格结构的所有字段设置为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。 对于指定为5或更多的每个字段,您还应该为分配的每个字段将分数计数器增加2,或者为每个分配5个或更多的字段增加1(这将为每个长度为n> 3的序列提供n-2个点。)

这就是全部。在完成所有2D阵列后,得分计数器将保持玩家的分数。

复杂度为O(n ^ 2),这一点都不差(实际上你无法在复杂性方面找到更好的解决方案)。

答案 1 :(得分:0)

要了解规则,请尝试此链接www.springfrog.com/games/othello/othello.htm

使用的数据结构:

board:int [8] [8];

uncounted_red:2,uncounted_black:-2,空:0;

counting_red:1,counting_black:-1

score_red:int,score_black:int;


算法:

  1. 查找具有长度> gt的连续红色的序列3

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

  3. 通过序列中已经计算过的栓钉进一步降低分数。

  4. 计算得分后,计算所有未计数的钉子。

  5. 重复黑色过程。

  6. winner = score_red&gt;得分_Llack?红色:黑色。


  7. 问题现在减少到如何执行第1步。