考虑到康威生命游戏(或任何其他细胞自动化游戏)中游戏的当前标记,如何才能找到可以评估为提供的标记的合法先前标记的数量?
例如,假设生命游戏可以表示为:
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是网格中单元格的总数)。
缓存当然可以在某些地方提供帮助,但它究竟适合哪些地方?
任何帮助将不胜感激
答案 0 :(得分:0)
对于m*m
电路板,您可以使用动态编程在O(m*8^m)
中执行此操作。
我们的想法是从电路板顶部开始向下工作,计算i-1, i
位置的每对行的所有行i+1
第{...}位置以给出正确的i
'输出行。
这比2^O(n) = 2^(O(m*m))
好,但速度很慢。
我不认为你会比那更好。