[英]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.