我正在尝试计算节点的有效邻居
数组包含元素,如[2,8,3,0,1,4,7,6,5]
矩阵:
2 8 3
0 1 4
7 6 5
它类似于 8 谜题逻辑。在上面的矩阵中,我可以用 2 或 1 或 7 交换 0。我尝试使用 -1、+1、-3、+3。但是 0 不能与 3 交换。所以我不能使用 -1 或 +1。我还需要更新数组中的位置。实现这一目标的逻辑是什么。
我正在尝试计算节点的有效邻居
数组包含元素,如[2,8,3,0,1,4,7,6,5]
矩阵:
2 8 3
0 1 4
7 6 5
它类似于 8 谜题逻辑。在上面的矩阵中,我可以用 2 或 1 或 7 交换 0。我尝试使用 -1、+1、-3、+3。但是 0 不能与 3 交换。所以我不能使用 -1 或 +1。我还需要更新数组中的位置。实现这一目标的逻辑是什么。
由于它只有 3x3,您可以对邻居列表进行硬编码(如果它更复杂,我建议编写一个计算它的逻辑):
neighbour-map := {0:[1,3], 1:[0,2,4], 2:[1,4,5],...}
0:[1,3]
表示数组中的第一项 (value= 2
) 在索引上有邻居:1,3 (values: 8
and 0
)。等等
如果您需要处理更大的“矩阵”,那么您应该计算邻居。将输入移动到矩阵(数组数组)中,然后根据 ak0053792 在下面写的“规则”列表计算它会更容易 - 但也处理所有“角落”案例(在例如,最上面的行在 y-1 处没有邻居)。
简单的逻辑是检查我们从中交换所选元素的数组元素是否是相邻元素。这可以通过以下算法完成
1) 定位当前元素的位置
2) 定位进行交换的元素的位置。
3) 检查交换元素的位置是否在当前元素下方的范围内,因此如果当前元素的位置是 x,y 则交换元素必须位于:
1) x-1, y-1
2) x-1, y
3) x-1, y+1
4) x, y-1
5) x, y+1
6) x+1, y+1
7) x+1, y
8) x+1, y-1