生命游戏中合法的先前行动数量

时间:2017-01-25 18:24:40

标签: algorithm conways-game-of-life

考虑到康威生命游戏(或任何其他细胞自动化游戏)中游戏的当前标记,如何才能找到可以评估为提供的标记的合法先前标记的数量?

例如,假设生命游戏可以表示为:

0 0 0 0 0 ...
X 0 X 0 0 ...
0 X 0 0 0 ...
0 0 0 0 X ...
...

其中X是" alive / on / true"并且0是"死/关/错",或更简单地作为boolean[][],如何解决以下问题:

public static int numberOfValidPreviousTicks(boolean[][] current) {
    return -1; // return answer
}

很明显,人们可以从网格大小找到每个可能的先前游戏状态,并确定是否会使用正常规则评估当前状态。

但是,必须有一些明显的方法来加速这个过程,使其不是O(2^n)(其中n是网格中单元格的总数)。

缓存当然可以在某些地方提供帮助,但它究竟适合哪些地方?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

对于m*m电路板,您可以使用动态编程在O(m*8^m)中执行此操作。

我们的想法是从电路板顶部开始向下工作,计算i-1, i位置的每对行的所有行i+1第{...}位置以给出正确的i'输出行。

这比2^O(n) = 2^(O(m*m))好,但速度很慢。

我不认为你会比那更好。