【问题标题】:Finding the longest sequence on a board?找到板上最长的序列?
【发布时间】:2013-11-20 19:32:17
【问题描述】:

我需要一个执行以下操作的函数:

作为输入,它需要一个 n×n 棋盘,棋盘上的每个点要么是空的,要么是黑棋,要么是白棋,还有一个位置。

作为输出,它返回给定位置的最长序列的长度。如果位置为空,则返回0。

例如,如果输入了这个板。

BUUUU
WWWB
UUUUU

其中B为黑石,W为白石,U为空点,输入的位置为(1,0),输出为3。

或者如果输入了这个板:

BUUU
WUUU
BUUU
BUUU

并且位置是 0,3 输出将是零,因为位置是空的。如果位置为 3,0,则输出将为 2,因为黑色列。

序列可以是水平的、垂直的或对角的。

这是我目前所拥有的:

如果给我一个位置,我会向上、向下、两侧和两条对角线循环。我一直循环直到我发现序列中断,然后返回最长的序列。例如,如果这是板:

WUU
WWU
WUU

位置是 1,0。我会横向循环,发现最长的水平序列是1,对角循环,找到最长的序列是1,然后垂直循环,找到最长的序列是3,因此返回3。

我怎样才能更快地做到这一点?该函数需要在一秒钟内调用大约 1000 万次。我当前的函数每秒可以执行大约 800 万次。

【问题讨论】:

  • 您尝试过什么尝试解决这个问题?
  • “我当前的功能”可能应该发布在问题中,以便我们可以更直接地提供帮助。
  • @mccainz 我在上面解释过。
  • @CoreyOgburn 抱歉,我不能发布我当前的功能。我的描述应该可以很好地了解我的功能是如何工作的。
  • 当我问,“你尝试过什么尝试解决这个问题?”我的意思是你解决这个问题的代码在哪里。要求一个完整的解决方案有点不受欢迎,尤其是在没有证明自己努力解决的情况下。

标签: algorithm artificial-intelligence computer-science


【解决方案1】:

这是一个 O(n^2) 操作。以行优先的顺序遍历电路板。对于棋盘上的每个位置,使用每个方向(水平、垂直和对角线)保持最长连续序列的 3 元组计数。当遇到占用位置时,检查所有相邻位置的连续序列,并增加最大长度这个位置应该是对所述序列的有效补充。祝你好运。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多