Я опишу алгоритм для выполнения того, что вы хотите, надеюсь, будет соответствовать вашим потребностям.
Сначала возьмите исходный массив чисел и разбейте его, как вы хотите, на 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 становится графом с хроматическим числом 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-х цветных картах, возможно, вы Вы знакомы с этим?).
Надеюсь, этот ответ поможет, оставьте комментарий, если он у вас есть.