广度优先遍历,走迷宫思路:
1、创建二维数组,0表示是路,1表示是墙;创建队列Q,存储可遍历的点,Q的第一个元素为起始点
2、从队列中取一个点,开始,按上、左、下、右的顺序遍历周围的点next,next点在数组的范围内,且值为0,则把next存入队列Q中,并在steps(行走记录二维数组)中记录步数,该点周围的四个点遍历完后,从Q中取下一个点,重复以上步骤,直到Q中没有点或者当前点为终点为止
3、最后打印steps即为迷宫路线
代码:
package main

import (
"fmt"
"os"
) type point struct {
i, j int
} //获取临近的点
func (p point) add(r point) point {
return point{p.i + r.i, p.j + r.j}
} //判断点是否在二维数组中,并返回点的值
func (p point) at(grid [][]int) (int, bool) {
if p.i < || p.i >= len(grid) {
return , false
}
if p.j < || p.j >= len(grid[p.i]) {
return , false
}
return grid[p.i][p.j], true
} //点的遍历顺序,上、左、下、右
var dirs = []point{
{-, }, {, -}, {, }, {, },
} func walk(maze [][]int, start, end point) [][]int { steps := make([][]int, len(maze)) for i := range steps {
steps[i] = make([]int, len(maze[i]))
} Q := []point{start} for len(Q) > {
cur := Q[]
Q = Q[:] if cur == end {
break
} for _, dir := range dirs {
next := cur.add(dir) val, ok := next.at(maze) //next点在数组中,且不能为墙 ,next点不能是起点
if !ok || val != {
continue
} if next == start {
continue
} if steps[next.i][next.j] == && next.i <= end.i && next.j <= end.j {
curSteps, _ := cur.at(steps)
steps[next.i][next.j] = curSteps +
Q = append(Q, next)
} }
}
return steps
} func readMaze(fileName string) [][]int {
file, _ := os.Open(fileName) defer file.Close()
var row, col int
fmt.Fscanf(file, "%d %d", &row, &col) maze := make([][]int, row)
for i := range maze {
maze[i] = make([]int, col)
for j := range maze[i] {
fmt.Fscan(file, &maze[i][j])
}
}
return maze
} func main() { maze := readMaze("arr.in")
steps := walk(maze, point{, }, point{len(maze) - , len(maze[]) - })
for _, row := range steps {
for _, val := range row {
fmt.Printf("%3d ", val)
}
fmt.Println()
}
}

打印结果:

arr.in文件内容


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. 2018-2019 20165219 网络对抗 Exp5 MSF基础

    实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms ...

  2. 利用django form 模块处理post请求

    在django框架中,利用 form 模块处理post请求提交的数据,可以大大提高开发效率,减小代码冗余度,提高性能 models.py 中: from django.db import models ...

  3. 自定义JSON返回字段

    今天看到一篇文章,里面介绍了如何自定义返回json字段,感觉挺好用的,这里学习一下. 实现工具类: /** * @author fengzp * @date 17/2/20上午10:34 * @ema ...

  4. php的session获取不到问题之ie浏览器(yaf框架)

    最近在内网写代码的时候遇到一个很怪异的问题, 花了好长时间调试,在次记录一下问题和解决方法. 问题描述: 内网开发使用的yaf框架,在火狐,谷歌,创建的session和cookie都能获取的到,但是在 ...

  5. elasticsearch5.2.1使用logstash同步mysql

    centos 本人亲测可以  首先安装好mysql,elasticsearch   不懂的请参考另一篇文章 安装logstash官方:https://www.elastic.co/guide/en/l ...

  6. jdk命令行工具(一)

    1.概述 熟悉java开发的人应该都知道在jdk的bin目录下有许多的工具,这些工具主要用于监视虚拟机和故障处理.这些故障处理工具被Sun公司称作为“礼物”附赠给JDK的使用者,并在软件的使用说明中把 ...

  7. 定期删除Azure存储账号下N天之前的数据文件-ASM

    ######RemoveStorageBlob*DaysOld##### <# .SYNOPSIS Remove all blob contents from one storage accou ...

  8. 电信10兆指的是多少Mbps

    一般电信10兆(10Mbps)指的是:下载速度最大在1.25MB/s 1Mbps(兆位/秒)     =     0.125MB/S(兆字节/秒) 8Mbps(兆位/秒)     =     1MB/ ...

  9. [转] Maven 直接下载依赖项 artifact, dependency:get

    [From]http://dnotes.wikidot.com/dependency:get-example To download an artifact into local repository ...

  10. Mac下一台电脑管理多个SSH KEY(转)

    一.关于ssh是什么? http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 二.需求: 一台电脑上(Mac os)管理多个ssh ...