我是编程新手,作为学校任务,我需要在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)。
但不知怎的,我需要添加每个节点的邻居,如果有人能给我一些细节,我会非常感激。
答案 0 :(得分:3)
做数学。
north = currentPos - gridSize;
east = currentPos + 1;
south = currentPos + gridSize;
west = currentPos - 1;
当然要检查负值;)
答案 1 :(得分:2)
假设您的Node
列在M
行和N
列中。为简单起见,让nodes[r][c]
成为Node
行r
和c
列(基于零的索引)的引用,目前我们需要空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)。