Генерация идеально распределенной сетки из массива - PullRequest
0 голосов
/ 17 июня 2010

Я ищу формулу или правило, которые позволят мне распределить n символов в сетку n * n с как можно более точным распределением.Допустим, у нас есть массив из 5 символов, от A до E. Вот пример того, как это определенно не должно получиться:

A B C D E
B C D E A
C D E A B
D E A B C
E A B C D

С этим шаблоном буквы слипаются и не располагаются равномерно.Посмотрите, например, диагональные линии с повторяющимися буквами E, A и т. Д. Если бы мы попробовали другой шаблон, однако:

A B C D E
D E A B C
B C D E A
E A B C D
C D E A B

Теперь с этим шаблоном все символы равномерно распределены по сетке.Например, вы вряд ли найдете букву B рядом с другой буквой B по обеим осям.

Я надеюсь, что здесь есть правило о том, как вам следует сдвигать конфигурацию ABCDE для каждойrow, чтобы создать растянутый шаблон, поэтому я могу использовать его для вычисления не только небольших массивов, таких как этот, но и массивов любого размера.Любые идеи относительно того, как это может быть достигнуто?Язык, на котором я пытаюсь это сделать, - это Objective-c, если это помогает.

Обновление: Предложение Моронона, кажется, добилось цели (обратите внимание на то, что он добавил использование простого кода для n это около sqrt ( n )).Вот схема, построенная благодаря его ответам.

 B C D E F G H I J K L M N O P Q R S 
P Q R S  B C D E F G H I J K L M N O 
L M N O P Q R S  B C D E F G H I J K 
H I J K L M N O P Q R S  B C D E F G 
D E F G H I J K L M N O P Q R S  B C 
S  B C D E F G H I J K L M N O P Q R 
O P Q R S  B C D E F G H I J K L M N 
K L M N O P Q R S  B C D E F G H I J 
G H I J K L M N O P Q R S  B C D E F 
C D E F G H I J K L M N O P Q R S  B 
R S  B C D E F G H I J K L M N O P Q 
N O P Q R S  B C D E F G H I J K L M 
J K L M N O P Q R S  B C D E F G H I 
F G H I J K L M N O P Q R S  B C D E 
B C D E F G H I J K L M N O P Q R S  
Q R S  B C D E F G H I J K L M N O P 
M N O P Q R S  B C D E F G H I J K L 
I J K L M N O P Q R S  B C D E F G H 
E F G H I J K L M N O P Q R S  B C D 

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Вы можете выбрать число (скажем, k) относительно простого к n (и, возможно, близкое к n / 2 или sqrt (n) или как угодно), и продолжать сдвигать на k.

Например, n = 8. Выберите k = 3. Вы получите

A B C D E F G H
F G H A B C D E
C D E F G H A B
H A B C D E F G
E F G H A B C D 
B C D E F G H A
G H A B C D E F
D E F G H A B C

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

Это работает для вас?

Также это может помочь: Латинские квадраты .

0 голосов
/ 17 июня 2010

Пока ваш массив содержит более 4 букв, смещение их на две вправо (как вы сделали) всегда будет давать результаты, которые не касаются друг друга.Если вам нужна какая-то другая сумма, используйте следующие рекомендации.

Диапазон величины смены должен быть в пределах:

2 <= shift_amount <= (array.length - 2)

Это связано с тем, что «не трогать» строку выше,символ должен находиться на расстоянии не менее 2 пробелов от него в следующей строке:

X X X X X
X X O X X
A X X X A

В этом примере представьте, что буква O уже помещена в эту строку.Теперь нам нужно сгенерировать следующую строку.Буквы А представляют собой ближайшие точки, на которых буква О может находиться на следующей строке, которая находится на расстоянии 2 пробелов.

Если вы хотите наибольшее распределение (т. Е. Числа расположены на наибольшем расстоянии друг от друга), вам следует выбрать число в середине.из этого диапазона (например, 3 для 6, 3 или 4 для 7 и т. д.).


Вот еще несколько примеров, которые меньше касаются равномерного распределения, но больше касаются касания чисел:

4x4 смещено на 2 (успех): 2 <= 2 <= 2

A B C D
C D A B
A B C D
...

5x5 смещено на 3 (успех): 2 <= 3 <= 3

A B C D E
D E A B C
B C D E A
E A B C D
C D E A B

5x5 смещено на 4 (ошибка): 2 <= 4 <!= 3

A B C D E
E A B C D
D E A B C
C D E A B
B C D E A

6x6 смещено на 2 (успех): 2 <= 2 <= 4

A B C D E F
C D E F A B
E F A B C D
...

26x26 смещено на 2 (успех): 2 <= 2 <= 24

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...