转载用队列求解迷宫最短路径及其应用(围住神经猫)

Posted Golang语言社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载用队列求解迷宫最短路径及其应用(围住神经猫)相关的知识,希望对你有一定的参考价值。

问题

给定一个M×N的迷宫图,求一条从指定入口到出口的最短路径.假设迷宫图如图所示(M=8, N=8)

【转载】用队列求解迷宫最短路径及其应用(围住神经猫) 
对于图中的每个方块,空白表示通道,阴影表示墙。所求路径必须是简单路径,即在求得路径上不能重复出现同一通道块。
为了算法方便,在迷宫外围加了一道围墙。
对应迷宫数组为:

  1. var gameMap = [M + 2][N + 2]int{

  2.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  3.         {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

  4.         {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

  5.         {1, 0, 0, 0, 0, 1, 1, 0, 0, 1},

  6.         {1, 0, 1, 1, 1, 0, 0, 0, 0, 1},

  7.         {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},

  8.         {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},

  9.         {1, 0, 1, 1, 1, 0, 1, 1, 0, 1},

  10.         {1, 1, 0, 0, 0, 0, 0, 0, 0, 1},

  11.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  12.     }

复制代码

实现

go语言实现求解:

  1. package main


  2. import (

  3.     "fmt"

  4. )


  5. const (

  6.     M = 8

  7.     N = 8

  8. )


  9. // 方块类型

  10. type Box struct {

  11.     i   int // 方块行号

  12.     j   int // 方块列号

  13.     pre int // 上一个方块在队列中位置

  14. }


  15. // 顺序队

  16. type Queue struct {

  17.     data  []Box

  18.     front int

  19.     rear  int

  20. }


  21. var (

  22.     gameMap = [M + 2][N + 2]int{

  23.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  24.         {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

  25.         {1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

  26.         {1, 0, 0, 0, 0, 1, 1, 0, 0, 1},

  27.         {1, 0, 1, 1, 1, 0, 0, 0, 0, 1},

  28.         {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},

  29.         {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},

  30.         {1, 0, 1, 1, 1, 0, 1, 1, 0, 1},

  31.         {1, 1, 0, 0, 0, 0, 0, 0, 0, 1},

  32.         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

  33.     }

  34. )


  35. func gameSearch(xStart, yStart, xEnd, yEnd int) bool {

  36.     var i, j, di int

  37.     find := false

  38.     var queue Queue

  39.     queue.data = []Box{}

  40.     queue.front = -1

  41.     queue.rear = -1

  42.     queue.rear++

  43.     queue.data = append(queue.data, Box{})

  44.     queue.data[queue.rear].i = xStart

  45.     queue.data[queue.rear].j = yStart // (xStart, yStart)进队

  46.     queue.data[queue.rear].pre = -1

  47.     gameMap[xStart][yStart] = -1

  48.     for queue.front != queue.rear && !find {

  49.         queue.front++

  50.         i = queue.data[queue.front].i

  51.         j = queue.data[queue.front].j

  52.         if i == xEnd && j == yEnd {

  53.             find = true

  54.             printPath(&queue, queue.front)

  55.             return true

  56.         }

  57.         // 顺时针

  58.         for di = 0; di < 4; di++ {

  59.             switch di {

  60.             case 0:

  61.                 i = queue.data[queue.front].i - 1

  62.                 j = queue.data[queue.front].j

  63.             case 1:

  64.                 i = queue.data[queue.front].i

  65.                 j = queue.data[queue.front].j + 1

  66.             case 2:

  67.                 i = queue.data[queue.front].i + 1

  68.                 j = queue.data[queue.front].j

  69.             case 3:

  70.                 i = queue.data[queue.front].i

  71.                 j = queue.data[queue.front].j - 1

  72.             }

  73.             if gameMap[i][j] == 0 {

  74.                 queue.rear++

  75.                 queue.data = append(queue.data, Box{})

  76.                 queue.data[queue.rear].i = i

  77.                 queue.data[queue.rear].j = j

  78.                 queue.data[queue.rear].pre = queue.front

  79.                 gameMap[i][j] = -1

  80.             }

  81.         }

  82.     }

  83.     return false

  84. }


  85. func printPath(queue *Queue, front int) {

  86.     var k, j, ns = front, 0, 0

  87.     var maxSize = len(queue.data)

  88.     fmt.Println("\n")

  89.     for k != 0 {

  90.         j = k

  91.         k = queue.data[k].pre

  92.         queue.data[j].pre = -1

  93.     }

  94.     k = 0

  95.     fmt.Println("迷宫路径如下:\n")

  96.     for k < maxSize {

  97.         if queue.data[k].pre == -1 {

  98.             ns++

  99.             fmt.Printf("\t(%d, %d)", queue.data[k].i, queue.data[k].j)

  100.             if ns%5 == 0 {

  101.                 fmt.Println("\n")

  102.             }

  103.         }

  104.         k++

  105.     }

  106. }


  107. func main() {

  108.     gameSearch(1, 1, 8, 8)

  109. }

复制代码

运行结果

【转载】用队列求解迷宫最短路径及其应用(围住神经猫)

应用

围住神经猫
 
游戏使用C#写的,项目源码
下载体验

最后

附上我喜欢的歌的英文翻译
心做し

以上是关于转载用队列求解迷宫最短路径及其应用(围住神经猫)的主要内容,如果未能解决你的问题,请参考以下文章

队列应用一随机迷宫|随机起点终点*最短路径算法

栈与队列应用:迷宫问题(DFS非最短路径)

BFS求解迷宫的最短路径问题

03 队列:迷宫的最短路径

bfs_迷宫求最短路径

宽度优先搜索--------迷宫的最短路径问题(dfs)