maze.go

package main

import (
"fmt"
"os"
) /**
* 广度优先算法
*/
/**
* 从文件中读取数据
*/ func readMaze(filename string) [][]int {
file, err := os.Open(filename)
if err != nil {
panic(err)
}
var cols, rows int
fmt.Fscanf(file, "%d %d", &rows, &cols)
maze := make([][]int, rows)
for i := range maze {
maze[i] = make([]int, cols)
for j := range maze[i] {
fmt.Fscanf(file, "%d", &maze[i][j])
}
}
return maze
} /**
* 定义要走的节点下标
*/
type point struct {
i, j int
} /**
* 定义,四个方向 ,上左下右
*/
var dirs = [4]point{point{-1, 0}, point{0, -1}, point{1, 0}, point{0, 1},} //走的节点
//走迷宫
/**
* maze 迷宫地址
* strt 开始位置
* end 走出迷宫位置
*/
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) > 0 {
cur := Q[0] //取一个第一个位置
Q = Q[1:]
//fmt.Printf("Q=%v ", Q)
//发现终点就退出
if cur == end {
break
} for _, dir := range dirs { //开始进行 上 左 下 右 的行走路线
next := cur.add(dir) //拿到下个节点的值
//撞墙检测
val, ok := next.at(maze)
if !ok || val == 1 {
continue
}
//检测是否走过了
val, ok = next.at(steps)
if !ok || val != 0 {
continue
}
//检测是否回到原点了不能探索
if next == start {
continue
}
//开始探索 ,将值存入 steps
curStep, _ := cur.at(steps)
steps[next.i][next.j] = curStep + 1 Q = append(Q, next)
}
}
return steps
} func (p point) at(grid [][]int) (int, bool) {
//往上越界,往下越界
if p.i < 0 || p.i >= len(grid) {
return 0, false
} if p.j < 0 || p.j >= len(grid[p.i]) {
return 0, false
} return grid[p.i][p.j], true } // 添加节点
func (p point) add(r point) point {
return point{p.i + r.i, p.j + r.j}
} func main() {
maze := readMaze("maze.in") //读取地图数据
steps := walk(maze, point{0, 0}, point{len(maze) - 1, len(maze[0]) - 1})
for _, rows := range steps {
for _, val := range rows {
fmt.Printf("%3d ", val)
}
fmt.Println()
} }

maze.in

6 5
0 1 0 0 0
0 0 0 1 0
0 1 0 1 0
1 1 1 0 0
0 1 0 0 1
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. 【BZOJ4030】[HEOI2015]小L的白日梦

    [BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...

  2. luoguP3598 Koishi Loves Number Theory

    题目 题解 等比数列,最后统一除以(x-1)(这里数据都存在逆元....) (不存在逆元可以考虑表示成:x*p^y的pair形式,最后上下把p的次数相减(类似扩展Lucas)) 求:lcm(x^(ai ...

  3. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  4. Mac下查看已安装的jdk版本及其安装目录

    1.打开终端,输入:/usr/libexec/java_home -V 注意:输入命令参数区分大小写(-v是不对的,必须是-V) 2.如图:为输入命令: 当前Mac已安装jdk目录: Mac默认使用的 ...

  5. ORA-00923: FROM keyword not found where expected(单双引号)

    1.前提 在学习oracel的过程中遇到的一个关于单双引号的问题 备注一下 2.学习过程中创建表语句是这样的 create table DEPT_DML --部门表( DEPT_NO NUMBER(8 ...

  6. <HTML>页面与互联网

    托管 1.数据传输:托管公司允许你在一定时间内向访问者发送的页面和数据量. 2.备份:公司是否对你的页面定期备份,从而在服务器出现硬件故障时能够恢复. 域名 www.starbuzzcoffee.co ...

  7. JGUI源码:实现蒙版层显示(18)

    有的时候需要显示一个蒙版层,蒙版层显示的主要原理是在指定元素比如div上创建一个子元素div,设置absolute.宽高100%.设置z-index置于顶层,设置半透明效果,fadein,fadeou ...

  8. 前端自动提示功能插件-typeahead

    typeahead https://npm.taobao.org/package/npm-typeahead A lightweight web-app that implements typeahe ...

  9. ES2015 中的函数式Mixin

    原文链接:http://raganwald.com/2015/06/17/functional-mixins.html 在“原型即对象”中,我们看到可以对原型使用 Object.assign 来模拟 ...

  10. php的api接口

    在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么, ...