我在另一个网站上看到了这个采访问题。
在奥赛罗的游戏中,红色或黑色磁盘按照某些规则放置在8x8网格上。玩家选择他们的颜色,并且网格上具有最大磁盘数的玩家获胜。
给出两个2D阵列(一个用于红色,另一个用于黑色)表示磁盘的存在/不存在,以及以下规则:
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
以最高分数确定获胜者。
答案 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;
算法:
查找具有长度> gt的连续红色的序列3
对于找到的每个序列,添加分数长度 - 2
通过序列中已经计算过的栓钉进一步降低分数。
计算得分后,计算所有未计数的钉子。
重复黑色过程。
winner = score_red&gt;得分_Llack?红色:黑色。
问题现在减少到如何执行第1步。