我有一个可以表示为boolean[][]
的网格,例如
new boolean[][] {
{true, false, true, ...},
{false, true, false, ...}
{true, false, true, ...}
...
}
代表一个网格:
O X O ...
X O X ...
O X O ...
...
其中O
为/ alive / true且X为off / dead / false。
网格总是一个矩形或正方形的尺寸(长度或宽度)可以是一个非平凡的长度(大于20)
这种蜂窝自动化的规则是:
如果下一个4个单元格在当前刻度线中只有一个存活,则单元格在下一个刻度线上存活:
在所有其他情况下,单元格在下一个刻度线处死亡。
特殊情况是网格底行和最右列的单元格,这些单元格在下一个刻度线上都被删除。
例如,
的输入网格O X X
X X O
X X X
将是
O O
X O
下一个刻度,
因此游戏规则非常简单。
问题是,从任何给定的位置,如何确定将评估到当前价格的有效先前价格的总数?
很明显,如果输入是m x n
网格,可以生成网格大小m+1 x n+1
的每个可能的网格组合,评估刻度并比较位置。但是,这将是一个2^(O(m x n))
的解决方案,并且这种方法存在很多冗余。
我编写了一种计算每个可能的底行组合的方法,然后将它们组合成一个“加权底行”,然后继续向上遍历网格。这消除了反复计算相同结果的重复,但仍然可以明显改进。类似的方法是从右侧或两者的组合向内移动。
我的想法是,对于任何给定的细胞,它仅受当前细胞对角线左上角的细胞的影响。例如。在10x10
上,左下角上一个刻度的单元格组合在很大程度上不受右上角刻度线上单元格组合的影响。
当然有一种方法可以找到有效的先前网格的总数,这些网格考虑到大多数单元格不会相互影响的事实?
我主要是在寻找对这种方法的理解,而不是任何完整解决方案的代码 - 如果你愿意,请继续进行!
答案 0 :(得分:0)
如果我理解你的问题,你想要计算某些配置的前映像。一般来说,这个问题已知是NP完全的,因此在合理的时间内难以解决。不,您不必构建每个配置并测试它是否为您提供了一个开始,但可能是一些回溯将帮助您(似乎您尝试过类似的东西)或动态编程方法。