這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
問題
給定一個M×N的迷宮圖,求一條從指定入口到出口的最短路徑.假設迷宮圖(M=8, N=8)
對於圖中的每個方塊,空白表示通道,陰影表示牆。所求路徑必須是簡單路徑,即在求得路徑上不能重複出現同一通道塊。
為了演算法方便,在迷宮外圍加了一道圍牆。
對應迷宮數組為:
var gameMap = [M + 2][N + 2]int{ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 1, 1, 0, 1}, {1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, }
實現
go語言實現求解:
package mainimport ( "fmt")const ( M = 8 N = 8)// 方塊類型type Box struct { i int // 方塊行號 j int // 方塊列號 pre int // 上一個方塊在隊列中位置}// 順序隊type Queue struct { data []Box front int rear int}var ( gameMap = [M + 2][N + 2]int{ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 1, 1, 0, 1}, {1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, })func gameSearch(xStart, yStart, xEnd, yEnd int) bool { var i, j, di int find := false var queue Queue queue.data = []Box{} queue.front = -1 queue.rear = -1 queue.rear++ queue.data = append(queue.data, Box{}) queue.data[queue.rear].i = xStart queue.data[queue.rear].j = yStart // (xStart, yStart)進隊 queue.data[queue.rear].pre = -1 gameMap[xStart][yStart] = -1 for queue.front != queue.rear && !find { queue.front++ i = queue.data[queue.front].i j = queue.data[queue.front].j if i == xEnd && j == yEnd { find = true printPath(&queue, queue.front) return true } // 順時針 for di = 0; di < 4; di++ { switch di { case 0: i = queue.data[queue.front].i - 1 j = queue.data[queue.front].j case 1: i = queue.data[queue.front].i j = queue.data[queue.front].j + 1 case 2: i = queue.data[queue.front].i + 1 j = queue.data[queue.front].j case 3: i = queue.data[queue.front].i j = queue.data[queue.front].j - 1 } if gameMap[i][j] == 0 { queue.rear++ queue.data = append(queue.data, Box{}) queue.data[queue.rear].i = i queue.data[queue.rear].j = j queue.data[queue.rear].pre = queue.front gameMap[i][j] = -1 } } } return false}func printPath(queue *Queue, front int) { var k, j, ns = front, 0, 0 var maxSize = len(queue.data) fmt.Println("\n") for k != 0 { j = k k = queue.data[k].pre queue.data[j].pre = -1 } k = 0 fmt.Println("迷宮路徑如下:\n") for k < maxSize { if queue.data[k].pre == -1 { ns++ fmt.Printf("\t(%d, %d)", queue.data[k].i, queue.data[k].j) if ns%5 == 0 { fmt.Println("\n") } } k++ }}func main() { gameSearch(1, 1, 8, 8)}
運行結果
應用
圍住神經貓
遊戲使用C#寫的,項目源碼
下載體驗
最後
附上我喜歡的歌的英文翻譯
心做し