maze.go

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "os"
  6. )
  7.  
  8. /**
  9. * 广度优先算法
  10. */
  11. /**
  12. * 从文件中读取数据
  13. */
  14.  
  15. func readMaze(filename string) [][]int {
  16. file, err := os.Open(filename)
  17. if err != nil {
  18. panic(err)
  19. }
  20. var cols, rows int
  21. fmt.Fscanf(file, "%d %d", &rows, &cols)
  22. maze := make([][]int, rows)
  23. for i := range maze {
  24. maze[i] = make([]int, cols)
  25. for j := range maze[i] {
  26. fmt.Fscanf(file, "%d", &maze[i][j])
  27. }
  28. }
  29. return maze
  30. }
  31.  
  32. /**
  33. * 定义要走的节点下标
  34. */
  35. type point struct {
  36. i, j int
  37. }
  38.  
  39. /**
  40. * 定义,四个方向 ,上左下右
  41. */
  42. var dirs = [4]point{point{-1, 0}, point{0, -1}, point{1, 0}, point{0, 1},}
  43.  
  44. //走的节点
  45. //走迷宫
  46. /**
  47. * maze 迷宫地址
  48. * strt 开始位置
  49. * end 走出迷宫位置
  50. */
  51. func walk(maze [][]int, start, end point) [][]int {
  52. steps := make([][]int, len(maze))
  53. for i := range steps {
  54. steps[i] = make([]int, len(maze[i]))
  55. }
  56. Q := []point{start}
  57. for len(Q) > 0 {
  58. cur := Q[0] //取一个第一个位置
  59. Q = Q[1:]
  60. //fmt.Printf("Q=%v ", Q)
  61. //发现终点就退出
  62. if cur == end {
  63. break
  64. }
  65.  
  66. for _, dir := range dirs { //开始进行 上 左 下 右 的行走路线
  67. next := cur.add(dir) //拿到下个节点的值
  68. //撞墙检测
  69. val, ok := next.at(maze)
  70. if !ok || val == 1 {
  71. continue
  72. }
  73. //检测是否走过了
  74. val, ok = next.at(steps)
  75. if !ok || val != 0 {
  76. continue
  77. }
  78. //检测是否回到原点了不能探索
  79. if next == start {
  80. continue
  81. }
  82. //开始探索 ,将值存入 steps
  83. curStep, _ := cur.at(steps)
  84. steps[next.i][next.j] = curStep + 1
  85.  
  86. Q = append(Q, next)
  87. }
  88. }
  89. return steps
  90. }
  91.  
  92. func (p point) at(grid [][]int) (int, bool) {
  93. //往上越界,往下越界
  94. if p.i < 0 || p.i >= len(grid) {
  95. return 0, false
  96. }
  97.  
  98. if p.j < 0 || p.j >= len(grid[p.i]) {
  99. return 0, false
  100. }
  101.  
  102. return grid[p.i][p.j], true
  103.  
  104. }
  105.  
  106. // 添加节点
  107. func (p point) add(r point) point {
  108. return point{p.i + r.i, p.j + r.j}
  109. }
  110.  
  111. func main() {
  112. maze := readMaze("maze.in") //读取地图数据
  113. steps := walk(maze, point{0, 0}, point{len(maze) - 1, len(maze[0]) - 1})
  114. for _, rows := range steps {
  115. for _, val := range rows {
  116. fmt.Printf("%3d ", val)
  117. }
  118. fmt.Println()
  119. }
  120.  
  121. }

maze.in

  1. 6 5
  2. 0 1 0 0 0
  3. 0 0 0 1 0
  4. 0 1 0 1 0
  5. 1 1 1 0 0
  6. 0 1 0 0 1
  7. 0 1 0 0 0

golang 实现广度优先算法(走迷宫)的更多相关文章

  1. golang广度优先算法-走迷宫

    广度优先遍历,走迷宫思路: 1.创建二维数组,0表示是路,1表示是墙:创建队列Q,存储可遍历的点,Q的第一个元素为起始点 2.从队列中取一个点,开始,按上.左.下.右的顺序遍历周围的点next,nex ...

  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. flutter - 01 基础介绍以及ListView

    这篇主要讲flutter最基本的操作.我们从一个实例入手,先不需要知道它里面的每一行是什么意思,我会慢慢说. main.dart import 'package:flutter/material.da ...

  2. Struts2 返回 json 格式数据

    最近由于工作原因,没时间更新,那些没能看到的同学,很抱歉了,话不多说,继续写~~ 关于json的返回需要用到一个工具包来将书转换为json格式,在此用到的jar包为: import net.sf.js ...

  3. Java基础知识拾遗(四)

    IO SequenceInputStream,允许链接多个InputStream对象.在操作上该类从第一个InputStream对象进行读取,知道读取完全部内容,然后切换到第二个InputStream ...

  4. J.U.C-三剑客[semaphore\CyclicBarrier\CountDownLatch]

    一.semaphore信号量,底层也是基于AQS 使用: /** * 可以理解为控制某个资源最多有多少个线程同时执行,(比如洗手间,并行与排队) * 如果满了只能等待直到其它资源释放(可以理解为并发量 ...

  5. python—异常

    异常是在程序中不可避免的,当程序遇到一个异常时程序就会停止,可以使用try—except进行处理异常,即便在出现异常程序也可以继续运行. 语法: try: 代码 except 异常名: 处理异常的代码 ...

  6. 关于Java的volatile

    volatile的作用 1.防止指令重排序 首先要理解什么是指令重排序?指令重排序的利弊?后续举例说明 2.多线程访问共享资源时,缓解synchronized重量级锁带来的性能问题 但是volatil ...

  7. git错误记录及解决

    一.git每次提交.拉取都要输用户名和密码 问题描述:每次提交.拉取文件时都要输用户名和密码,特别麻烦 原因:在git上面注册了用户名a,然后本机安装了TortoiseGit工具,登录时会在本机C:\ ...

  8. Asp.net 项目部署的两个问题

    1:关于MVC中BundleCollection压缩js css文件 发布后获取失败的问题 原因是: 默认本地vs里面调试的时候,因为web.config文件里面有一个debug属性,当有此属性时,默 ...

  9. pandas基础用法

    首先生成一维数组 data = pd.Series([1,2,3,4,5,6,7,8,9])data运行结果 data.head()#默认取前五条,当然也可以加参数 data.tail()#默认取前五 ...

  10. Arduino语言简介

    参考链接:https://www.cnblogs.com/xczr/p/7831343.html