连接图形矩阵中的节点

Connecting nodes in a matrix for a graph

你好我正在做这个小项目,它需要我在 Java 中构建一个类似于棋盘的矩阵。我应该让骑士从一个点到达另一个点(以骑士移动的方式)。所以我需要找到最短的路才能到达那里。

我的问题是,我无法连接边缘以到达该点。我可以查明顶点是否是有效移动,但我似乎无法找到创建节点以到达该点的方法。例如,

0 XXXXX

1 XXXOX

2 XXXXX

3 XXKXX

4 XXXXX

5 XXXXX

我需要创建连接 K 和 O 的节点,以便稍后找出最短距离。 PS。我会接受如何到达那里的提示或一些提示。真的不需要确切的代码。非常感谢你! 我知道上面的矩阵表示不好,但请不要批评我

棋盘可以用二维数组来实现。矩阵中的每个单元格都可以被认为是图中的一个节点(或顶点)。边由两个节点(在本例中为两个单元格)组成,一个是 fromsource [我们称之为 Nod A],另一个是 toneighbordestination 节点 [ 我们称之为节点 B]。

如果有可能从 node A 移动到 node B,则 Edge 退出。

您可以使用 Dijkstra's algorithmhttp://krishnalearnings.blogspot.in/2015/07/implementation-in-java-for-dijkstras.html

对于具有 Knight 位置的节点,您可以看到 Knight 可以移动到并添加到最小堆的单元格的可能性。每条边的权重是恒定的。您只需要更新节点的成本。

经典的Breadth-First-Search可能是最简单的方法:

class Location {
    int x;
    int y;

    List<Location> adjacent() {
        // TODO return list of locations reachable in a single step
    }
}

List<Location> findShortestPath(Location start, Location destination) {
    Location[][] previous = new Location[8][8];

    Deque<Location> queue = new ArrayDeque<>();
    queue.add(start);
    do {
        Location loc = queue.poll();
        for (Location n : loc.neighbors()) {
            if (previous[n.x][n.y] == null) {
                previous[n.x][n.y] = loc;
                queue.add(n);

                if (n.x == destination.x && n.y == destination.y) {
                    // we've found a way, let's reconstruct the list of steps
                    List<Location> path = new ArrayList<>();
                    for (Location l = n; l != start; l = previous[l.x][l.y]) {
                        path.add(l);
                    }
                    path.reverse();
                    return path;
                }
            }
        }
    } while (!queue.isEmpty());
    return null; // no path exists
}

此代码从起始位置枚举所有路径。因此,如果有到达目的地的路径,它就会找到它。此外,因为路径是按顺序或升序列举的,所以第一个这样的路径将是最短的。