从数组生成完美分布的网格

发布于 2024-09-06 02:57:03 字数 1431 浏览 2 评论 0原文

我正在寻找一个公式或规则,允许我将 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 配置以产生展开模式,这样我不仅可以用它来计算像这样的小数组,还可以计算任何大小的数组。关于如何实现这一点有什么想法吗?如果有帮助的话,我尝试使用的语言是 Objective-c。

更新: Moron 的建议似乎成功了(请注意他在 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 

I'm looking for a formula or rule that will allow me to distribute n characters into a n*n grid with as perfect of a distribution as possible. Let's say we have an array of 5 characters, A through E. Here's an example of how it definitely shouldn't turn out:

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

With this pattern, the letters clump together and are not evenly spaced. See for example the diagonal lines with repeating E's and A's etc. If we were to try another pattern however:

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

Now with this pattern, all the characters are evenly spaced along the grid. For example, you're not likely to find the letter B all that close to another B on either axis.

I'm hoping there's a rule here as to how you should shift the the A B C D E configuration around for each row to produce a spread out pattern, so I can use it to calculate not only small arrays such as this one, but arrays of any size. Any ideas as to how this can be accomplished? The language I'm trying to do this in is Objective-c if that helps.

Update:
Moron's suggestion seems to have done the trick (plase note his addition of using a coprime to n that's near sqrt(n)). Here's a grid plotted thanks to his answers.

 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 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我们的影子 2024-09-13 02:57:03

您可以选择一个与 n 互质的数字(例如 k)(可能接近 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

我假设您不希望看到相同的行再次出现。

这对你有用吗?

这些也可能有帮助:拉丁方

You could pick a number (say k) relatively prime to n (and perhaps close to n/2 or sqrt(n) or whatever you like), and keep shifting by k.

For eg n = 8. Pick k = 3. You get

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

I have assumed you don't want to see same rows appear again.

Does that work for you?

Also these might help: Latin Squares.

琉璃繁缕 2024-09-13 02:57:03

只要你的数组包含 4 个以上的字母,将它们向右移动两个(就像你所做的那样),总是会产生彼此不接触的结果。如果您想要其他金额,请遵循以下准则。

移位量的范围应在以下范围内:

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

这是因为为了不“接触”上面的一行,下一行上的字符必须与其相距至少 2 个空格:

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

在本例中,假设 O 已经放置在那条线。现在我们需要生成下一行。 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

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
...

As long as your array contains more than 4 letters, shifting them two to the right (like you did), will always produce results that don't touch each other. If you want some other amount, use the following guidelines.

The range of the shift amount should be within:

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

This is because to not "touch" a row above, a character must be at least 2 spaces away from it on the next row:

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

In this example, imagine that the O was already placed on that line. Now we need to generate the next line. The A's represent the closest points an O can be on the next line, which is 2 spaces away.

If you want the most distribution (i.e. the numbers spaced out the most) you should choose the number in the middle of this range (e.g. 3 for 6, 3 or 4 for 7, etc.).


Here are some more examples which are less about even distribution but more about if the numbers touch or not:

4x4 shifted by 2 (success): 2 <= 2 <= 2

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

5x5 shifted by 3 (success): 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 shifted by 4 (failure): 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 shifted by 2 (success): 2 <= 2 <= 4

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

26x26 shifted by 2 (success): 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
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文