如您所見,有一張地圖,我想通過尋路來確定哪些城市彼此喜歡。
地圖中的黃色瓷磚是陸地,藍色瓷磚是海洋。紅色字體表示有水路,綠色字體表示有路。正確的路徑應該是公路-公路、水路-水路、公路-港口-水路或水路-港口-公路。所以,
2,6City 可以通過 (2,6City)-(1,6)-(0,6)-(1,5)-(2,5)-(3,4Harbor)-(2,4City) 鏈接到 2,4City ),
2,6City 可以通過 (2,6City)-(1,6)-(0,6)-(1,5)-(2,5)-(3,4Harbor)-(2,4City) 鏈接到 0,0City )– (1,4)-(0,3City)-(0,2)-(0,1)-(0,0City),
2,6City 可以通過 (2,6City)-(1,6)-(0,6)-(1,5)-(2,5)-(3,4Harbor)-(3,3) 鏈接到 3,0City )– (3,2)-(4,1Harbor)-(3,0City)。
但是,當我使用GKGridGraph創建尋路地圖時,我不知道如何判斷水路不通公路的情況。你可以看到,我不想要:
2,6City 可以通過 (2,6City)-(2,5)-(2.4City) 鏈接到 2,4City 或
2,4City 與 2,2City 相關聯,因為 (2,4City)-(3,4Harbor)-(3,3)-(3,2)-(2,2City)
那么,有什么建議嗎?非常感謝。

uj5u.com熱心網友回復:
如果您使用GKGridGraph(fromStartingGridAt:width:height:diagonalsAllowed:)來創建圖形,那么每個節點都與其每個鄰居都有連接。所以你的地圖更好的圖片是這樣的:

由于每個節點都是連接的,它將找到穿過水的最短路徑。為了防止這種情況,您需要洗掉不可能的連接。您的圖表應如下所示:

要實作這一點,您只需使用以下命令從圖形中洗掉不需要的連接 GKGraphNode.removeConnections(to:bidirectional:)
這可以通過這樣的函式來實作:
func disconnect(_ a: vector_int2, _ b: vector_int2) {
guard
let first = grid.node(atGridPosition: a),
let second = grid.node(atGridPosition: b)
else {
return
}
first.removeConnections(to: [second], bidirectional: true)
}
根據您存盤和加載地圖的方式,更好的解決方案可能是從一個空圖開始,并在加載地圖時僅添加必要的連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386060.html
