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



我希望算法在具有已知维度的大型 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. 首先取原始的数字数组,并将其拆分为大小大致相等的 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 数组变成了色数为 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。同样清楚的是,4 色适用于任何m x n数组,证明了我们算法的有效性(这不是一个特别严格的证明,但希望你明白了(。

有一些事情需要注意。首先,你需要一个长度至少为 4 的初始数组,否则如果你不这样做,你将有少于 4 种"颜色"可以使用,并且很容易看出你不能只用 3 种颜色来着色这个图。此外,这个算法当然可以改进,比方说,现在看起来"更随机",虽然数字分布均匀,但它们看起来不是很随机,因为例如,来自arr1的数字只能在最终数组的某些位置找到。但是,该算法确实大致平均地分配数字(最好arr1arr2arr3arr4大小都相同(并按照问题的要求进行操作,因此我相信它是有效的。

有关图形着色的更多信息,我建议您阅读维基百科页面(更多的数学密集型(,或者这个相关的很酷的问题(4色图定理,也许你熟悉它?

希望这个答案有所帮助,如果您有任何评论问题。

最新更新