2011-11-22 74 views
1

我正在解决java二维数组中的NxN难题。我可以在四个方向移动到空的方块:左,右,下或上。我的问题是,如果我得到空瓷砖(节点)的索引(行列值),我怎么知道我是否必须移动左,右,下或上生成其后继(邻居)节点。如何确定移动的方向

例如,如果它是9个元素,然后我可以这样做的一个1Dimensional数组: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这里我先前公布其与同一个任务我处理

感谢

回答

0

你必须把两件事情考虑,以确定在哪个方向,你可以移动:

  1. 无论你已经访问过的相邻区块(否则,你就有可能进入一个无限循环)的一个。为此,每次你想访问一个瓷砖,你必须首先检查瓷砖是否已经被访问;如果不将它添加到一个集合并访问它,否则忽略它。请注意,检查很容易,只需询问瓷砖是否已经在设置中。
  2. 为了确定每个瓦片的邻居,你必须检查四种可能的边缘情况,在其他情况下就可以安全地访问砖:
    • 该瓦片在第一行中,不要去拜访以前的排
    • 该瓦片是最后一排,不要去访问下一行
    • 该瓦片是第一列,不要去访问前一列
    • 该瓦片在最后一列,不要去访问下一列
0

这是simples哟认为你不动的故事,而是空间。鉴于空砖的坐标,它可以在所有方向上移动,除非它位于其中一个边界上,这将限制移动。

+0

感谢您的回复。所以如果我找到你的话,这意味着我必须同时调用up(),down(),left()和right()函数? –

+0

@EddyFreeman一般你不知道哪一个是正确的举动,这就是为什么它是一个*搜索*,我的意思是空的瓷砖可以在所有的方向移动,它不会离开电路板。这决定了搜索树,然后你必须定义你的搜索算法(可能使用一些启发式来驱动搜索) –

+0

再次感谢。我使用manhattan heurestic(f = g + h),g是从开始节点到当前节点的开销,h是从当前节点到目标节点的开销。你能给我一点解释怎么做来推动搜索。这是我第一次这样做,所以我需要一些具体的解释来继续。目前我有四个函数(up(),down(),left()和right()),那么接下来我需要做什么才能使用heureustic来确定下一步的移动? –