广度优先遍历,走迷宫思路:
1、创建二维数组,0表示是路,1表示是墙;创建队列Q,存储可遍历的点,Q的第一个元素为起始点
2、从队列中取一个点,开始,按上、左、下、右的顺序遍历周围的点next,next点在数组的范围内,且值为0,则把next存入队列Q中,并在steps(行走记录二维数组)中记录步数,该点周围的四个点遍历完后,从Q中取下一个点,重复以上步骤,直到Q中没有点或者当前点为终点为止
3、最后打印steps即为迷宫路线
代码:
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "os"
  6. )
  7.  
  8. type point struct {
  9. i, j int
  10. }
  11.  
  12. //获取临近的点
  13. func (p point) add(r point) point {
  14. return point{p.i + r.i, p.j + r.j}
  15. }
  16.  
  17. //判断点是否在二维数组中,并返回点的值
  18. func (p point) at(grid [][]int) (int, bool) {
  19. if p.i < || p.i >= len(grid) {
  20. return , false
  21. }
  22. if p.j < || p.j >= len(grid[p.i]) {
  23. return , false
  24. }
  25. return grid[p.i][p.j], true
  26. }
  27.  
  28. //点的遍历顺序,上、左、下、右
  29. var dirs = []point{
  30. {-, }, {, -}, {, }, {, },
  31. }
  32.  
  33. func walk(maze [][]int, start, end point) [][]int {
  34.  
  35. steps := make([][]int, len(maze))
  36.  
  37. for i := range steps {
  38. steps[i] = make([]int, len(maze[i]))
  39. }
  40.  
  41. Q := []point{start}
  42.  
  43. for len(Q) > {
  44. cur := Q[]
  45. Q = Q[:]
  46.  
  47. if cur == end {
  48. break
  49. }
  50.  
  51. for _, dir := range dirs {
  52. next := cur.add(dir)
  53.  
  54. val, ok := next.at(maze)
  55.  
  56. //next点在数组中,且不能为墙 ,next点不能是起点
  57. if !ok || val != {
  58. continue
  59. }
  60.  
  61. if next == start {
  62. continue
  63. }
  64.  
  65. if steps[next.i][next.j] == && next.i <= end.i && next.j <= end.j {
  66. curSteps, _ := cur.at(steps)
  67. steps[next.i][next.j] = curSteps +
  68. Q = append(Q, next)
  69. }
  70.  
  71. }
  72. }
  73. return steps
  74. }
  75.  
  76. func readMaze(fileName string) [][]int {
  77. file, _ := os.Open(fileName)
  78.  
  79. defer file.Close()
  80. var row, col int
  81. fmt.Fscanf(file, "%d %d", &row, &col)
  82.  
  83. maze := make([][]int, row)
  84. for i := range maze {
  85. maze[i] = make([]int, col)
  86. for j := range maze[i] {
  87. fmt.Fscan(file, &maze[i][j])
  88. }
  89. }
  90. return maze
  91. }
  92.  
  93. func main() {
  94.  
  95. maze := readMaze("arr.in")
  96. steps := walk(maze, point{, }, point{len(maze) - , len(maze[]) - })
  97. for _, row := range steps {
  98. for _, val := range row {
  99. fmt.Printf("%3d ", val)
  100. }
  101. fmt.Println()
  102. }
  103. }

打印结果:

arr.in文件内容

  1.  

golang广度优先算法-走迷宫的更多相关文章

  1. golang 实现广度优先算法(走迷宫)

    maze.go package main import ( "fmt" "os" ) /** * 广度优先算法 */ /** * 从文件中读取数据 */ fun ...

  2. Java与算法之(12) - 老鼠再闯迷宫(广度优先算法)

    贪吃的小老鼠又回来了,这次有什么新的办法吃到奶酪呢? 规则不变,只能上下左右在格子内移动. 因为上次的深度优先算法让老鼠走了不少冤枉路,这次老鼠带来了帮手探路鼠.探路鼠的使用规则如下: 小老鼠按右.下 ...

  3. 用Q-learning算法实现自动走迷宫机器人

    项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...

  4. LeetCode 79,这道走迷宫问题为什么不能用宽搜呢?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第48篇文章,我们一起来看看LeetCode当中的第79题,搜索单词(Word Search). 这一题官方给的难 ...

  5. 剑指Offer——回溯算法解迷宫问题(java版)

    剑指Offer--回溯算法解迷宫问题(java版)   以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路.   下面我们来详细讲一 ...

  6. 广度优先搜索--POJ迷宫问题

    Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...

  7. SDOI2012 走迷宫

    走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...

  8. Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  9. Java基于OpenCV实现走迷宫(图片+路线展示)

    Java基于OpenCV实现走迷宫(图片+路线展示) 由于疫情,待在家中,太过无聊.同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来.特此记录. 原图: 这张图,由于不是非常清晰, ...

随机推荐

  1. 安卓 往SD卡里写文件不能及时更新的问题

    我们做Android开发时奖保存图片到SD卡,但是Gallery中不能及时显示 下面我找到了问题所在然后解决了这个问题. 当保存图片后打开gallery时,有的会自动给你刷新,有的不行,这样就导致图片 ...

  2. sqlite3简单操作

    最近在操作公司视频设备的tutk转发服务器的时候,用到的数据库是sqlite,在此复习一下 目录 1 建立数据库档案 2 在sqlite3提示列下操作 3 SQL的指令格式 4 建立资料表 5 建立索 ...

  3. 【OCP认证12c题库】CUUG 071题库考试原题及答案(26)

    26.choose two Examine the structure of the PRODUCTS table. Which two statements are true? A) EXPIRY_ ...

  4. docker安装配置

    ########################################## #docker安装配置 #环境centos7 #配置docker阿里源 echo '#Docker [docker ...

  5. Get 和 Post 方法的选择和URL的设计

    原文链接:http://yifei.me/note/540 HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在设计API或者表单的时候我们需要选择合适的方法.一般有两种方案: 只 ...

  6. webpack 踩的坑

    我是看着这篇博客学习的 http://www.jianshu.com/p/42e11515c10f# 看到loaders的时候,按照博主写法去试 结果报错....找了好久,上网查了好多 也看错误信息了 ...

  7. [Objective-C语言教程]类和对象(24)

    Objective-C编程语言的主要目的是为C编程语言添加面向对象,类是Objective-C的核心特性,支持面向对象编程,通常称为用户定义类型. 类用于指定对象的形式,它将数据表示和方法组合在一起, ...

  8. Django2.0 URL配置详解

    转自:https://www.cnblogs.com/feixuelove1009/p/8399338.html Django2.0发布后,很多人都拥抱变化,加入了2的行列. 但是和1.11相比,2. ...

  9. 使用selenium的WebDriver和ChromeDriver实现UI自动化

    下载chromedriver chromedriver与chrome的对应关系表:http://blog.csdn.net/huilan_same/article/details/51896672 下 ...

  10. 【kuangbin】计算几何部分最新模板

    二维几何部分 // `计算几何模板` ; const double inf = 1e20; const double pi = acos(-1.0); ; //`Compares a double t ...