在2D数组中分配数字集而不相邻的算法

时间:2018-09-15 23:02:08

标签: arrays algorithm computation-theory computation

我想要一种算法,以便在大型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

如果您看到任何数字,您将永远不会看到它在任何方向上相邻?

1 个答案:

答案 0 :(得分:1)

我将描述一种算法,该算法可以满足您的需求。

  1. 首先获取原始数字数组,然后将其拆分为大小近似相等的4个数组(在您的示例中,它看起来像(0,1,2,3),(4,5 ,6,7),(8,9,10,11),(12,13,14,15)如果可以的话)。分别标记这些子数组arr1arr2arr3arr4

  2. 现在,要填充数组,请按以下方式填充行:如果该行的索引为偶数(第零,第二,第四等),则将行中的第一个元素填充为来自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中的数字只会可以在最终数组中的某些位置找到。但是,此算法的确分配了大致相等的数字(最好是arr1arr2arr3arr4大小都相同),并按照问题的要求进行操作,所以我相信这是有效的。

要了解有关图形着色的更多信息,建议您阅读Wikipedia page(需要更多的数学知识)或this与此相关的很酷的问题(4色图定理,也许您对此很熟悉?)。

希望这个答案有帮助,如果有任何疑问,请发表评论。