JAVA - 如何在网格中编码节点邻居?

时间:2010-04-21 00:00:35

标签: java

我是编程新手,作为学校任务,我需要在Java中实现BFS,DFS和A *搜索算法,以便从给定大小的网格中的给定起始位置搜索给定目标,4x4,8x8,等

首先,我不知道如何编码所有节点的邻居。例如,在8x8网格中,1有2和9作为邻居,而Tile 12有4,11,13和20作为其邻居,但我正在努力编码。我需要邻居部分,以便我可以通过水平或垂直移动通过​​邻居从合适的起始位置移动到其他部分。

 1  2  3  4  5  6  7  8 
 9 10 11 12 13 14 15 16 
17 18 19 20 21 22 23 24 
25 26 27 28 29 30 31 32 
33 34 35 36 37 38 39 40 
41 42 43 44 45 46 47 48 
49 50 51 52 53 54 55 56 
57 58 59 60 61 62 63 64

我的节点类是:

class Node {
   int value;
   LinkedList<Node> neighbors;
   bool expanded;
}

让我说我给了一个8x8网格,所以如果我用8x8大小的网格启动程序:

1 - 我的main方法将创建一个节点的arrayList,例如node

ArrayList<Node> test = new ArrayList<Node>();

然后使用for循环为arrayList中的所有节点赋值1到64(如果网格大小为8x8)。

但不知怎的,我需要添加每个节点的邻居,如果有人能给我一些细节,我会非常感激。

2 个答案:

答案 0 :(得分:3)

做数学。

north = currentPos - gridSize;
east = currentPos + 1;
south = currentPos + gridSize;
west = currentPos - 1;

当然要检查负值;)

答案 1 :(得分:2)

假设您的Node列在M行和N列中。为简单起见,让nodes[r][c]成为Noderc列(基于零的索引)的引用,目前我们需要空List<Node> neighbors建立。

以下是构建它们的一种方法:

for (int r = 0; r < M; r++) {
  for (int c = 0; c < N; c++) {
    Node n = nodes[r][c];
    List<Node> neighbors = n.neighbors;
    if (r > 0) {     // has north
      neighbors.add(nodes[r-1][c]);
    }
    if (r < M - 1) { // has south
      neighbors.add(nodes[r+1][c]);
    }
    if (c > 0) {     // has west
      neighbors.add(nodes[r][c-1]);
    }
    if (c < N - 1) { // has east
      neighbors.add(nodes[r][c+1]);
    }
  }
}

  

我的main方法会创建ArrayList<Node>

在二维数据结构中处理网格要容易得多,无论是数组数组还是列表列表。如果您坚持使用1-D列表,那么请调用nodes[r][c]辅助函数,而不是nodeAt(r, c)

Node nodeAt(int r, int c) {
   return nodesList.get(r * N + c);
}

这是从二维索引到一维的标准转换(假设为row-major order)。