【问题标题】:Algorithmic complexity of examining all possible lines on a game board检查游戏板上所有可能线的算法复杂性
【发布时间】:2012-09-18 12:43:05
【问题描述】:

n x m 的游戏板上检查所有可能长度为 l 的线的时间复杂度是多少?

例如,井字棋盘是 3x3,线被定义为长度 3;有 8 条可能的线路。我们还可以想象一个 9x9 的棋盘和一条规则,即您需要一条长度为 5 的线才能获胜。您如何描述用 nml 的不同值检查每条可能的线的复杂性?

请注意,这考虑将游戏树遍历到未来的游戏状态,只是检查棋盘的当前状态以查看当前状态是否有赢家。

【问题讨论】:

  • 为什么首先要检查整个板子?
  • @phant0m 大概是因为您想知道是否有人赢了 - 除非您到处检查(直到找到一个),否则您不会知道。
  • @corsiKa 在每个玩家每次移动都将棋子放在棋盘某处的游戏中,不需要重新检查整个棋盘,至少在简单游戏中不需要,因为单个棋子不会影响整个董事会。例如,在连接 5 游戏中,您最多只需要检查 28 个字段,即使它是 1000x1000 字段。
  • @phant0m 我明白你的意思,特别是问题中的注释特别指出它不考虑遍历游戏树。我可以看到需要进行广域搜索来确定是否要做出获胜的举动,仅检查棋盘状态,并且如果做出举动,那么它是在尚未进入的棋盘上进行的。获胜状态,获胜状态的唯一可能性意味着最近的移动必须是获胜组合的一部分。
  • @corsiKa 我想我不明白你的意思。为什么要遍历游戏树?这不是我的意思,我也不是要寻找获胜的举动。我的意思是,在采取行动之后,您通常不需要评估整个棋盘来确定是否有人赢了。

标签: algorithm scalability big-o game-engine graph-algorithm


【解决方案1】:

显然,您需要检查水平线、垂直线和对角线。

让我们假设板的布局,如果两者不相等,n 总是较大的数字,并且它是侧放的“(乐高风格,而不是摩天大楼风格)。所以它是 n对面和m 高。

水平线的数量为n * (m - l)

垂直线的数量为m * (n - l)

对角线将是(m - l) * (n - l),或m*n - l*m - l*n + l*l

如果我们假设n >= m > l,那么我们可以肯定地说它在O(n^2) 之内,正如我们对二维板所期望的那样。

我们知道l > n >= m 不会有任何结果。如果n = m = l 我们有一个常数(2*n + 2)。如果n = l > m,我们还有一个更好的情况,因为我们不必检查对角线或垂直线,您只需检查m 线。如果n > l > m,那么我们可以再次排除垂直线,但必须考虑对角线。无论如何,它比做对角线、垂直和水平线要少。

不过,可以根据phant0m's 注释进行优化。它要求你知道最后一步是什么。

您可以放心地假设,如果采取行动,是在棋盘上没有赢家的时候做出的。因此,如果在棋盘上出现了一个获胜条件,那么它一定是由于最近的棋步而形成的。因此,给定此信息的最坏情况是获胜线是由最后的最新动作形成的。因此,您需要检查在每个方向(水平、垂直、前向对角线和后向对角线)延伸 l - 1 的 4 条线段。这是一共4 * (2*l - 1),把它安全地放在O(l)。考虑到您只需要存储一个额外的坐标(最近的移动),这是一种最明智的优化。

【讨论】:

  • 在对角线上,不应该是+ l*l吗?
  • 当然。一个简单的错字,已更正。显然,我的键盘……挫败了我的计划。哈哈哈哈......这是一个数学作业......好吧,我现在就离开。
  • @krjampani 你是对的 - 但在复杂性分析中,这样的常量(+1,*2)被删除了。
  • 好的,谢谢!我没有意识到这个问题是关于复杂性的。
猜你喜欢
  • 2014-04-25
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2018-02-09
  • 2013-01-10
  • 1970-01-01
相关资源
最近更新 更多