不是说第一个做对的人会有罐头吗?还是说我记错了?
一,题目大意
给一个黑白矩阵,执行以下操作 1010010^{100}10100 次:
* 对于白色,若四周八格都有黑,就将其涂为黑。
* 对于黑色,将其涂为白。
求最后矩阵样子。
二,纸上证明
由于操作次数太多,若模拟到世界末日也无法完成,所以我们只从初始状态一步推到最终状态。(即只管起始状态和结果,不管过程的对错)
结论1:初始时,一个颜色为黑且周围八格都为黑的格子,可当作白色格子处理。
由于操作会将当前所有黑色变成白色,会使原本最中间的格子“孤立无援”,易证其要在后续的第奇数操作中才有可能变成黑色。而 1010010^{100}10100 次操作为偶数次操作,因此在只管起始状态和结果时,我们可以将其当作白色格子处理。
结论2:该矩阵变化最终陷入长度为2循环,且题目所求的是循环之一。
当矩阵开始变化后,在结论1的前提下,只要有一个黑格子,就会像水波一样扩散,使得每个白格子周围至少有一个黑格子,每个黑格子周围至少有一个白格子。在此状态下,再进行一次操作会使整个矩阵颜色相反。而由于操作次数太多了,因此大小为 10610^{6}106 的矩阵有足够时间陷入循环。
结论3:在依据结论1的修改下,一个格子离与其最近的黑色格子(包括自己)的距离为偶数时,其最终颜色为黑色,反之为白色。
正如结论2的证明“再进行一次操作会使整个矩阵颜色相反”和“像水波一样扩散”,由于操作次数为偶数次,所以一个格子离与其最近的黑色格子(包括自己)的距离为偶数时,其最终颜色为黑色,反之为白色。
三,代码实现
本作者第二次做题解(第一次不懂规矩做的被删了),制作不易,求赞。