簡體   English   中英

連接圖的矩陣中的節點

[英]Connecting nodes in a matrix for a graph

嗨,我正在做這個小項目,需要我用Java構建類似於棋盤的矩陣。 我應該讓騎士從一個點到另一個(以騎士移動的方式)。 所以我需要找到最簡單的方法最終到達那里。

我的問題是,我無法連接邊緣達到該點。 我可以確定頂點是否是有效的移動,但似乎找不到找到達到該點的節點的方法。 例如,

0 XXXXX

1 XXXOX

2 XXXXX

3 XXKXX

4 XXXXX

5 XXXXX

我需要創建將K連接到O的節點,以便以后找到最短距離。 PS。 只要有一些提示如何到達那里的提示或一些提示,我都會沒事的。 確實不需要確切的代碼。 非常感謝你! 我知道那是矩陣的不好代表,但請給我批評

棋盤可以由2d陣列實現。 矩陣中的每個單元都可以視為圖中的一個節點(或頂點)。 Edge由兩個節點(在這種情況下為兩個單元)組成,一個是“ from或“ source [稱為節點A],另一個是“ to或“ neighbor或“ destination節點[稱為節點B]。

如果有可能從node A移到node B ,則Edge退出。

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

對於具有騎士位置的節點,您可以看到騎士可以移動到並添加最小堆的單元格的可能性。 每個邊緣的權重是恆定的。 您只需要更新節點的成本。

經典的廣度優先搜索可能是最簡單的方法:

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
}

此代碼枚舉了從起始位置開始的所有路徑。 因此,如果有到達目的地的路徑,它將找到它。 另外,由於路徑是按順序或遞增長度枚舉的,因此第一個此類路徑將是最短的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM