提问人:jordan 提问时间:8/23/2022 最后编辑:jordan 更新时间:8/24/2022 访问量:232
如何生成一个带有值的二维数组,每个值都有不同、不重复值的邻居?
How do I generate a 2D Array with values, each with neighbours of different, non-repeating values?
问:
我有一个方形的 2D 数组,我希望用 1 到 4 之间的值填充它。 为了正确起见,数组中任何值的邻居都需要如下所示,例如:
x 2 x
3 1 1
x 4 x
x 值与中间值 1 无关。正如我们所看到的,中间值 1 的邻居除了它自己之外,不会出现超过一次
不正确值的邻居将如下所示:
x 2 x
3 1 2
x 4 x
中间值 1 的邻居之一出现不止一次(值 2 出现两次),我们不希望出现这种情况。
我已经为这个问题制定了一个 LUA 解决方案,但它非常慢,因为它所做的只是在生成中添加 2 个规则并运行所有组合,直到找到有效的组合。
规则是:
- 角邻居(在我们的例子中是 xs)不能与中间值具有相同的值
- 相关邻居的下一个值不能与中间值具有相同的值。 对规则2的解释:
y y y y
y 1 y x
y y y y
此实例中的 x 的值不能为 1,这适用于每个垂直和水平方向(上-下-左-右)
编辑:我现在知道我可以重复一个可平铺的模式,但这不是我想要的,因为我不希望观察到清晰的重复
答:
您可以使用一个 Block,如果在任何方向上重复任意次数,则不会破坏邻里约束。一个这样的块(我敢肯定还有其他块,但我认为这是最微不足道的块)将是:
1 1 2 2
3 3 4 4
2 2 1 1
4 4 3 3
您可以在任何方向上重复此块任意次数,并且每个单元格将始终具有唯一的邻居。
例如,如果你需要一个 6x8 数组,只需向右和向下重复一次 Block,然后根据你想要的大小进行切片:
1 1 2 2 1 1
3 3 4 4 3 3
2 2 1 1 2 2
4 4 3 3 4 4
1 1 2 2 1 1
3 3 4 4 3 3
2 2 1 1 2 2
4 4 3 3 4 4
有趣的事实:在进一步的检查中,人们可能会意识到,Abhinav Mathur和我提出了一个有点类似的解决方案。如果你旋转我的方块并将 2 换成 3,模式是相同的。但是,在大多数情况下,他用重复行而不是整个块的公式可能更容易实现。
您可以简单地重复一个模式来获得所需的数组。
- 第 1 行:重复所需的列数
1 2 3 4 1 2 3...
- 第 2 行:以类似方式重复
3 4 1 2 3 4 1...
- 第 3 行:与第 2 行相同
- 第 4 行:与第 1 行相同
- 第 5 行:从第 1 行开始重复模式
...继续所需的行数。
下面是 6x6 网格的示例:
1 2 3 4 1 2
3 4 1 2 3 4
3 4 1 2 3 4
1 2 3 4 1 2
1 2 3 4 1 2
3 4 1 2 3 4
这保证遵循这两个规则,因为:
- 值 here 的对角线将始终为 ,而 对于 。
x
5 - x
x != (5 - x)
x in [1,2,3,4]
- 下一个 over 值 for 将始终为 ,反之亦然(在任何方向上),并且 for 和 相同。
1
3
2
4
编辑:在您的评论中,您提到您需要数组更加“多样化”。任何形式的随机性都意味着我们不能使用任何模式。在这种情况下,您当前的解决方案无法改进,因为您不能使用任何模式进行优化。
评论
我写这个作为第二个答案,因为有一个新的要求:不要使用任何重复模式!
顶级域名
只需从左到右逐行填写数组。具有以下约束条件:
您要填充值 x,然后只需考虑彩色单元格中的值。
- 如果绿色单元格被填充,则 x 只有一种可能性(绿色或红色单元格中都不存在的一个值)
- 如果绿色单元格为空(您位于左边框)。然后有两个选项(其中一个值不在红色单元格中)。但是您选择的值也必须是蓝色单元格中的值之一(这始终是可能的),否则以后将无法填充值 y!如果蓝色单元格未填充(右边框),则可以忽略此辅助约束。
解释
您可以将其分为两个独立的问题。把你的数组想象成一个棋盘,分别求解明场和暗场中的数字,因为它们彼此不关心(明和暗不共享任何邻居,因为它们的邻居总是分别具有相反的颜色)。
所以你把你的棋盘分成明暗两色(只是为了更好地理解,你不必真正分开数组)。
然后,使用一些简单的约束分别解决它们。该值(绿色)不允许等于相隔两个单元格的值之一(红色):
只需从左到右逐行填写值即可。实际上,您只能在左边框处选择一个值,因为其余值将受到上述其他三个值的约束。在这个左边边界,你必须小心。绿色单元格中选择的值必须与蓝色单元格中的值之一相同。否则,下一个单元格(红色)将是不可能的!
只需对浅色和深色单元格执行此操作,然后将它们重新组合在一起:
这应该相对容易实现并且非常快,因为它不是暴力破解,而是直接构建一个有效的解决方案。当说选择一个数字或填充值时,我的意思是只获取可能的值并随机选择一个。
您也可以在excel中尝试自己,这就像一个非常无聊的数独,因为实际上没有太多选择,它真的很受限制:)。
评论
1 1 3 4 2 3 1 1 2 2 4 4 2 1 1 4 4 3 3 1 3 3 2 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (x7)
上一个:从数组列表中可视化树
下一个:具有特定数量 1 的二进制随机数
评论
1 3 4 1 3 3 4 3 2 1 4 2 4 1 2 3 4 1 2 1 4 3 2 1 2 3 4 1 2 4 4 3 2 1 3 4