Алгоритм для распределения множества чисел в двумерном массиве без соседних самих себя - PullRequest
0 голосов
/ 16 сентября 2018

Я хочу, чтобы алгоритм распределял набор чисел, таких как (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 голосов
/ 16 сентября 2018

Я опишу алгоритм для выполнения того, что вы хотите, надеюсь, будет соответствовать вашим потребностям.

  1. Сначала возьмите исходный массив чисел и разбейте его, как вы хотите, на 4 массива примерно одинакового размера (В вашем примере это может выглядеть как (0,1,2,3), (4,5 , 6,7), (8,9,10,11), (12,13,14,15), если это имеет смысл). Пометьте эти подмассивы arr1, arr2, arr3, arr4 соответственно.

  2. Теперь, чтобы заполнить массив, заполните строки следующим образом: Если строка имеет четный индекс (ноль, второй, четвертый и т. Д.), То заполните первый элемент в строке с помощью Радное число от arr1, в противном случае, если строка имеет нечетный индекс, заполните строку числом от второго arr3. Затем заполните следующий элемент массива случайным числом из arr, следующего за предыдущим. Например, если первым элементом строки было число из arr1, то следующим элементом в строке был бы элемент arr2, а следующий из arr3, а затем arr4, а затем вернуться к arr1 и т. д. И все.

Почему это работает: Если вам интересно, почему это работает, сначала рассмотрите двумерный массив как график. Включая диагонали, массив 2d становится графом с хроматическим числом 4, что означает, что для color графа требуется 4 уникальных элемента. Эти цвета в основном являются 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 «цветов» для работы, и легко увидеть, что вы не можете раскрасить этот график только 3 цветами. Кроме того, этот алгоритм, безусловно, можно улучшить, скажем, чтобы он казался «более случайным», как сейчас, в то время как числа распределены поровну, они будут казаться не очень случайными, так как, например, число из arr1 сможет только быть найденным в определенных местах в конечном массиве. Однако этот алгоритм распределяет числа примерно одинаково (лучше всего, если arr1, arr2, arr3, arr4 имеют одинаковый размер) и выполняет то, что задает вопрос, поэтому я считаю, что он действителен.

Для получения дополнительной информации о раскраске графов я бы порекомендовал прочитать страницу Википедии (более интенсивно по математике) или эту классную проблему, которая связана (теорема о 4-х цветных картах, возможно, вы Вы знакомы с этим?).

Надеюсь, этот ответ поможет, оставьте комментарий, если он у вас есть.

...