这个问题是关于阿贝尔沙堆的。阅读此先前的挑战,并观看此亲密视频以了解更多信息。
大小为n × n的阿贝尔沙堆是一个包含数字0、1、2和3(代表沙粒数量)的网格。添加两个沙堆的工作方式是:先逐个元素地添加元素,然后对高于3的任何元素进行推倒。推倒的顺序无关紧要,最终结果是相同的。当一个单元倾倒时,其数量减少4,而其每个直接相邻单元的数量增加1。这可能导致链反应。如果单元格位于网格的边缘,则在倾倒时掉落到网格上的所有颗粒都会消失。
例如,我要添加两个三乘三的沙堆(产生非常极端的连锁反应):
3 3 3 1 2 1 4 5 4 4 6 4 6 2 6 6 3 6 2 5 2 4 1 4 4 2 4 0 4 0 2 0 2 2 1 2
3 3 3 + 2 1 2 = 5 4 5 -> 6 0 6 -> 2 4 2 -> 3 0 3 -> 5 0 5 -> 1 4 1 -> 2 0 2 -> 4 0 4 -> 0 4 0 -> 1 0 1
3 3 3 1 2 1 4 5 4 4 6 4 6 2 6 6 3 6 2 5 2 4 1 4 4 2 4 0 4 0 2 0 2 2 1 2
在此挑战中,我们对所有可能的n × n沙堆的子集感兴趣。此子集包含您可以通过将任意沙堆添加到所有3s n by n沙堆中而获得的任何沙堆。例如,在上面我们看到了212 | 101 | 212
它在子集中,因为我们是通过在全三堆中添加一些东西来得到的。
现在,此子集具有一个有趣的元素:identity元素。如果采用此元素并将其添加到子集中的任何其他元素,则总和不变。换句话说,此沙堆的作用类似于该子集的零。恰好212 | 101 | 212
是3乘3的子集的零元素。例如:
2 2 2 2 1 2 4 3 4 0 5 0 2 1 2 2 2 2
2 2 2 + 1 0 1 = 3 2 3 -> 5 2 5 -> 1 6 1 -> 2 2 2
2 2 2 2 1 2 4 3 4 0 5 0 2 1 2 2 2 2
现在这是您的挑战:给定n,找到n by n grid 的子集的标识元素。通过为每种0, 1, 2, 3
图像分配一个具有足够对比度的独特颜色并输出n x n图像来输出图像。您的代码必须能够在一台合理的现代PC上在一分钟内产生50 x 50的大小写。
例如,500 x 500标识元素:
这里是蓝色= 3,绿色= 2,红色= 1,白色=0。但是您不必在答案中使用此配色方案。