分享
  1. 首页
  2. 文章

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

火蜥蜴 · · 2236 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

问题

×ばつ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 main
import (
 "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#写的,项目源码
下载体验

最后

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


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:火蜥蜴

查看原文:用队列求解迷宫最短路径及其应用(围住神经猫)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2236 次点击 ∙ 1 赞
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏