生命游戏的较少步骤方式

这种文章在各位大大看来一定是班门弄斧了,而且说的东西其实也是特别简单的,只是记录一下,如果有更好的希望说一下。

程序员了解了生命游戏的规则以后大多会直觉的想到这样一种方式,建立一个二维数组,每一个数组里面存放这True或者False,当然也不一定是数组,二进制文件什么的,反正是矩阵。

直觉的方式,深蓝色是处理中的,浅蓝色是处理过的

反正我一开始也是这样想的,不过很容易就想到为什么要用一个矩阵来一遍一遍的轮呢,可以光靠细胞之间的位置来确定,也就是说光记录细胞的坐标就好了。

单单记录细胞

下面详细说一下,感觉很多地方还有可以简化的地方,靠计算细胞间的距离(坐标差的绝对值)很容易确定一个坐标的生死。

第一步是选定一个坐标,计算出这个坐标周边距离不大于2的所有坐标(这个要现计算,因为没有储存那些空白的坐标),然后取出距离为2的细胞。

深绿色的块是基准的正在处理的细胞。

之所以距离是2,因为最终要计算的是一个细胞和它周边的空白的死活,所以距离超过2就不用考虑。

统计了周围细胞的数目就可以确定这个细胞的生死了,接下来要做的就是和这个细胞相邻的空白格子,有没有可能诞生新生命。

取出上面那个 5×5 矩阵的子集,也就是细胞相邻的点,获得一个 3×3 矩阵,并且还要排除掉相邻的并有细胞的点(即补集),得到的就是周边所有空白的格子。

这便是接下来要计算的格子。这之后自然是以每一个格子为基准,在最初的 5×5 矩阵上选取自己周边的格子(3×3 矩阵),并且计算周围细胞数量,看自己是否能重生。

基本上就是这样,当然这样表述仅仅是为了容易描述,也不一定要必须用矩阵的形式,可以单纯靠计算周围的细胞的坐标的距离和方向来判断是否复活。

另外一点是距离不大于二的的坐标之间往往会重复计算一些格子。

深色部分是将被重复计算的

解决的方法就是严格按照一定顺序处理细胞,比如说从左到右从上到下,这样如果左边或上边有了相近的细胞就不处理距离那个细胞为一的格子。

生命游戏的较少步骤方式》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注