我想要一种算法,以便在大型2D数组中以已知尺寸分布一组数字(0,1 ... 15),而又不让该数字与自身相邻:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7
3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10
6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13
如果您看到任何数字,您将永远不会看到它在任何方向上相邻?
答案 0 :(得分:1)
我将描述一种算法,该算法可以满足您的需求。
首先获取原始数字数组,然后将其拆分为大小近似相等的4个数组(在您的示例中,它看起来像(0,1,2,3),(4,5 ,6,7),(8,9,10,11),(12,13,14,15)如果可以的话)。分别标记这些子数组arr1
,arr2
,arr3
,arr4
。
现在,要填充数组,请按以下方式填充行:如果该行的索引为偶数(第零,第二,第四等),则将行中的第一个元素填充为来自arr1
的radnom数字,否则,如果该行的索引为奇数,则用第二个arr3
中的数字填充该行。然后,使用前一个之后的arr
中的随机数填充数组的下一个元素。例如,如果该行的第一个元素是arr1
中的一个数字,那么该行中的下一个元素将是arr2
的一个元素,随后是arr3
的一个元素,然后arr4
,然后回到arr1
,依此类推。就是这样。
它为什么起作用::如果您想知道为什么它起作用,请首先将2d数组视为图形。包括对角线在内的2d数组成为chromatic number 4的图形,这意味着它需要4个唯一元素来color
该图形。这些颜色基本上就是arr1
,...,arr4
的颜色,因此当用arr
的数字填充图形时,我们实际上是在给图形“着色”。
要查看图形的颜色,请考虑使用4x4数组。它可以是四种颜色:
[[ 1 , 2 , 3 , 4 ],
[ 3 , 4 , 1 , 2 ],
[ 1 , 2 , 3 , 4 ],
[ 3 , 4 , 1 , 2 ]]
请注意,这与上面的算法类似,但是它不是数字1-4,而是从数组arr1
,...,arr4
获取数字。还可以很清楚地看到,四色着色适用于任何m x n
数组,证明了我们算法的有效性(这不是特别严格的证明,但希望您能理解这一点)。
有些事情要注意。首先,您需要一个长度至少为4的初始数组,否则就好像您不需要的那样,您将只有不到4种“颜色”可以使用,并且很容易看出您不能仅使用3种颜色来为该图着色。另外,可以肯定地说,可以将该算法改进为,比如说现在看起来“随机性更高”,尽管数字分布均匀,但它们看起来并不是非常随机,例如arr1
中的数字只会可以在最终数组中的某些位置找到。但是,此算法的确分配了大致相等的数字(最好是arr1
,arr2
,arr3
,arr4
大小都相同),并按照问题的要求进行操作,所以我相信这是有效的。
要了解有关图形着色的更多信息,建议您阅读Wikipedia page(需要更多的数学知识)或this与此相关的很酷的问题(4色图定理,也许您对此很熟悉?)。
希望这个答案有帮助,如果有任何疑问,请发表评论。