从进化论中“基因视角”来看,基因是不朽的,而我们的角色——生命的意义——就是延续基因。在几个世纪之后,我们作为人类个体存在的所有痕迹、关于我们的记忆、我们所有的成就,很可能都会消失并被遗忘,除了那些成功通过世代繁衍而存活下来的基因。
当然,我们并不是从基因进化的视角来体验世界的,但“生命游戏”(Game of Life)是。生命游戏的宇宙是一个无限的二维正交方格网。每个单元格处于两种可能状态之一:存活或死亡。每个单元格与其八个邻居(水平、垂直或对角线相邻的单元格)进行交互。在每个时间步长,会发生以下转换:
- 任何存活的单元格,如果其邻居中少于两个存活,则会因人口过少而死亡。
- 任何存活的单元格,如果其邻居中有两个或三个存活,则会存活到下一代。
- 任何存活的单元格,如果其邻居中多于三个存活,则会因人口过剩而死亡。
- 任何死亡的单元格,如果其邻居中恰好有三个存活,则会因繁殖而变成存活状态。
初始模式(第 0 代)由一个 $N \times M$ 的有限网格给出,其中 $N \le 3$ 且 $M \le 5$,作为无限网格的一部分。这意味着其他所有网格的状态均为死亡。
遗传进化是生物生命的意义,它既是生命存在的原因和方式,也是未来生物存在的基础。游戏中的生命三位一体要求你解决三个问题:
- 在最初的 321 代(包括第 0 代)中,人口在哪个时刻达到最大值?
- 那个最大值是多少?
- 第 321 代的人口是多少?
输入格式
输入的第一行包含一个整数 $t$ ($1 \le t \le 300$),表示测试用例的数量。
每个测试用例包含多行。第一行包含两个正整数 $N$ 和 $M$。接下来的 $N$ 行,每行包含一个长度为 $M$ 的字符串,对应初始模式。我们使用 “#” 来描述一个存活的单元格,使用 “.” 来描述一个死亡的单元格。
输出格式
对于每个测试用例,在一行中输出三个整数 $a$、$b$ 和 $c$,其中 $a$ 表示人口达到最大值的代数,$b$ 是该代的人口数量,$c$ 是第 321 代的人口数量。如果存在多个代数的人口达到最大值,请选择最小的 $a$ 进行输出。
样例
输入格式 1
3 3 3 ... ##. .#. 3 3 .#. ... ### 3 3 ... ### ...
输出格式 1
1 4 4 10 20 12 0 3 3
Figure 1. Example of the Game of Life evolution over time steps 0 to 4.