我希望算法在具有已知维度的大型 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
如果你看任何数字,你永远不会看到它在任何方向上相邻?
我将描述一种算法,用于做你想做的事,希望能满足你的需求。
-
首先取原始的数字数组,并将其拆分为大小大致相等的 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 数组变成了色数为 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
的数字只能在最终数组的某些位置找到。但是,该算法确实大致平均地分配数字(最好arr1
,arr2
,arr3
,arr4
大小都相同(并按照问题的要求进行操作,因此我相信它是有效的。
有关图形着色的更多信息,我建议您阅读维基百科页面(更多的数学密集型(,或者这个相关的很酷的问题(4色图定理,也许你熟悉它?
希望这个答案有所帮助,如果您有任何评论问题。