如何确定移动方向

时间:2011-11-22 00:42:40

标签: java algorithm

我正在解决java 2D数组中的NxN难题。我可以在四个方向上移动到空的瓷砖:左,右,下或上。我的问题是,如果我得到空瓦片(节点)的索引(行en列值),我怎么知道我是否必须移动LEFT,RIGHT,DOWN或UP来生成其后继(邻居)节点。

例如,如果它是一个包含9个元素的1维数组,那么我可以执行以下操作:index是空图块的索引

if(index == 0){
            tempSuccessorNodes.add(new Node(swap(0,1,arrayPosition),curNode));
            tempSuccessorNodes.add(new Node(swap(0,3,arrayPosition),curNode));
        }
        else if(index == 1){
            tempSuccessorNodes.add(new Node(swap(0,1,arrayPosition),curNode));
            tempSuccessorNodes.add(new Node(swap(1, 4, arrayPosition),curNode));
            tempSuccessorNodes.add(new Node(swap(1, 2, arrayPosition),curNode));
        }

        ....

         if(index == 8){
            tempSuccessorNodes.add(new Node(swap(8, 7, arrayPosition),curNode));
            tempSuccessorNodes.add(new Node(swap(8, 5, arrayPosition),curNode));
        }

生成当前节点的后继者。但这里正在处理NxN(3x3是一个实例)。在知道空单元格/图块/节点的索引后,我怎么知道是否必须向左,向右,向下或向上移动?

我之前发布的question与我处理的同一任务相关

由于

2 个答案:

答案 0 :(得分:0)

很简单,你可以考虑不要移动故事,而是移动空间。给定空瓦片的坐标,它可以在所有方向上移动,除非它位于其中一个边界上,这将限制移动。

答案 1 :(得分:0)

您必须考虑两件事,以确定您可以移动的方向:

  1. 您是否已经访问过其中一个相邻的图块(否则,您可能会进入无限循环)。为此,每次要访问磁贴时,必须首先检查该磁贴是否已被访问过;如果没有将它添加到一个集合并访问它,否则忽略它。请注意,检查很简单,只需询问图块是否已在集合中。
  2. 要确定每个图块的邻居,您必须检查四个可能的边缘情况,在所有其他情况下,访问图块是安全的:
    • 如果图块位于第一行,则不要访问上一行
    • 如果图块位于最后一行,请不要访问下一行
    • 如果磁贴位于第一列,请不要访问上一列
    • 如果图块位于最后一列,请不要访问下一列
相关问题