golang 实现广度优先算法(走迷宫)
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 实现广度优先算法(走迷宫)的更多相关文章
- golang广度优先算法-走迷宫
广度优先遍历,走迷宫思路: 1.创建二维数组,0表示是路,1表示是墙:创建队列Q,存储可遍历的点,Q的第一个元素为起始点 2.从队列中取一个点,开始,按上.左.下.右的顺序遍历周围的点next,nex ...
- Java与算法之(12) - 老鼠再闯迷宫(广度优先算法)
贪吃的小老鼠又回来了,这次有什么新的办法吃到奶酪呢? 规则不变,只能上下左右在格子内移动. 因为上次的深度优先算法让老鼠走了不少冤枉路,这次老鼠带来了帮手探路鼠.探路鼠的使用规则如下: 小老鼠按右.下 ...
- 用Q-learning算法实现自动走迷宫机器人
项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...
- LeetCode 79,这道走迷宫问题为什么不能用宽搜呢?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第48篇文章,我们一起来看看LeetCode当中的第79题,搜索单词(Word Search). 这一题官方给的难 ...
- 剑指Offer——回溯算法解迷宫问题(java版)
剑指Offer--回溯算法解迷宫问题(java版) 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路. 下面我们来详细讲一 ...
- 广度优先搜索--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, ...
- SDOI2012 走迷宫
走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...
- Prim算法生成迷宫
初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...
- Java基于OpenCV实现走迷宫(图片+路线展示)
Java基于OpenCV实现走迷宫(图片+路线展示) 由于疫情,待在家中,太过无聊.同学发了我张迷宫图片,让我走迷宫来缓解暴躁,于是乎就码了一个程序出来.特此记录. 原图: 这张图,由于不是非常清晰, ...
随机推荐
- flutter - 01 基础介绍以及ListView
这篇主要讲flutter最基本的操作.我们从一个实例入手,先不需要知道它里面的每一行是什么意思,我会慢慢说. main.dart import 'package:flutter/material.da ...
- Struts2 返回 json 格式数据
最近由于工作原因,没时间更新,那些没能看到的同学,很抱歉了,话不多说,继续写~~ 关于json的返回需要用到一个工具包来将书转换为json格式,在此用到的jar包为: import net.sf.js ...
- Java基础知识拾遗(四)
IO SequenceInputStream,允许链接多个InputStream对象.在操作上该类从第一个InputStream对象进行读取,知道读取完全部内容,然后切换到第二个InputStream ...
- J.U.C-三剑客[semaphore\CyclicBarrier\CountDownLatch]
一.semaphore信号量,底层也是基于AQS 使用: /** * 可以理解为控制某个资源最多有多少个线程同时执行,(比如洗手间,并行与排队) * 如果满了只能等待直到其它资源释放(可以理解为并发量 ...
- python—异常
异常是在程序中不可避免的,当程序遇到一个异常时程序就会停止,可以使用try—except进行处理异常,即便在出现异常程序也可以继续运行. 语法: try: 代码 except 异常名: 处理异常的代码 ...
- 关于Java的volatile
volatile的作用 1.防止指令重排序 首先要理解什么是指令重排序?指令重排序的利弊?后续举例说明 2.多线程访问共享资源时,缓解synchronized重量级锁带来的性能问题 但是volatil ...
- git错误记录及解决
一.git每次提交.拉取都要输用户名和密码 问题描述:每次提交.拉取文件时都要输用户名和密码,特别麻烦 原因:在git上面注册了用户名a,然后本机安装了TortoiseGit工具,登录时会在本机C:\ ...
- Asp.net 项目部署的两个问题
1:关于MVC中BundleCollection压缩js css文件 发布后获取失败的问题 原因是: 默认本地vs里面调试的时候,因为web.config文件里面有一个debug属性,当有此属性时,默 ...
- pandas基础用法
首先生成一维数组 data = pd.Series([1,2,3,4,5,6,7,8,9])data运行结果 data.head()#默认取前五条,当然也可以加参数 data.tail()#默认取前五 ...
- Arduino语言简介
参考链接:https://www.cnblogs.com/xczr/p/7831343.html