Алгоритм для распределения множества чисел в двумерном массиве без соседних самих себя
Я хочу, чтобы алгоритм распределял набор чисел, таких как (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), если это имеет смысл). Пометьте эти подмассивы
arr1
,arr2
,arr3
,arr4
соответственно.Теперь, чтобы заполнить массив, заполните строки следующим образом: Если строка имеет четный индекс (ноль, второй, четвертый и т. Д.), То заполните первый элемент в строке радном числом из
arr1
в противном случае, если строка имеет нечетный индекс, заполните строку числом от второгоarr3
, Затем заполните следующий элемент массива случайным числом изarr
следуя предыдущему. Например, если первым элементом строки было число изarr1
тогда следующий элемент в строке будет элементомarr2
и следующее изarr3
, а потомarr4
, а затем вернуться кarr1
и т. д. И это все.
Почему это работает: Если вам интересно, почему это работает, сначала рассмотрите 2d массив как график. Включая диагонали, массив 2d становится графом с хроматическим числом 4, что означает, что для color
график. Эти цвета в основном то, что arr1
,..., arr4
так, при заполнении графика числами из arr
Мы эффективно "раскрашиваем" график.
Чтобы увидеть, как график окрашен, рассмотрим массив 4х4. Это может быть четыре цвета как таковые:
[[ 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 "цветов" для работы, и легко увидеть, что вы не можете раскрасить этот график только тремя цветами. Кроме того, этот алгоритм, безусловно, можно улучшить, скажем, чтобы он казался "более случайным", как сейчас, в то время как числа распределены одинаково, они будут казаться не очень случайными, как число из arr1
например, будет доступен только в определенных местах в конечном массиве. Однако этот алгоритм распределяет числа примерно одинаково (лучше всего, если arr1
, arr2
, arr3
, arr4
все одинакового размера) и делает то, что задает вопрос, поэтому я считаю, что это действительно.
Чтобы больше узнать о раскраске графов, я бы порекомендовал прочитать страницу Википедии (более интенсивную математику) или эту интересную проблему (теорема о 4-х цветных картах, может быть, вы знакомы с ней?).
Надеюсь, что этот ответ поможет, оставьте комментарий, если у вас есть.