【问题标题】:JAVA - How to code Node neighbours in a Grid?JAVA - 如何在网格中编码节点邻居?
【发布时间】:2011-02-10 09:24:33
【问题描述】:

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

首先我不知道如何编码所有节点的邻居。例如,在 8x8 网格中,瓷砖 1 有 2 和 9 作为邻居,瓷砖 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 - 我的主要方法将创建一个节点数组列表,例如节点

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

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

但不知何故,我需要添加每个节点的邻居,如果有人能给我一些细节,我将不胜感激。

【问题讨论】:

  • @ke3pup:编辑了你的问题,你可以努力更好地格式化你的问题并验证工作,因为你说 "Tile 12,所以很难看到你在说什么有 141,13,20 作为它的邻居” [原文如此] 而不是“4, 11, 13, 20”。我还补充说,您说的是 8x8 正方形(不是 4x4),并放置了一个显示瓷砖编号的正方形,以便人们更好地理解您的问题。
  • 哎呀,刚刚注意到...您的 Node 类应该以大写的“N”开头(因为这是 Java 约定)。
  • 再次感谢 WizardOfOdds 的更正。

标签: java


【解决方案1】:

假设您的Nodes 布置在M 行和N 列中。为简单起见,让nodes[r][c] 成为Node 在行r 和列c(从零开始的索引)的引用,目前我们要构建的List&lt;Node&gt; 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&lt;Node&gt;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多