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

原文地址:https://www.cnblogs.com/jackluo/p/10737350.html

时间: 2024-10-10 10:12:37

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

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图

ybt 1252 广度优先搜索 走迷宫(二维、最小步数)

1252:走迷宫 时间限制: 1000 ms         内存限制: 65536 KB提交数: 7272     通过数: 3241 [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. [输入] 第一行是两个整数,R和C,代表迷宫的长和宽.( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫. 空地格子用‘.’表示,

广度优先算法:迷宫问题

广度优先算法: 模拟队列:数据量较小,需要打印路径坐标 STL队列:数据量较大,只需要打印步数 迷宫问题 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, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线. Input 一个5 × 5的

算法:老鼠走迷宫问题

算法:老鼠走迷宫问题(初) [写在前面] 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. [问题描述] 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路. [代码] 对题目的描述部分 int migo[7][7]={ {2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 0, 0, 2, 2},

走迷宫——C++ 算法实现

这两个看了几个不错的走迷宫算法,然后按照自己的方式写了一个实现,代码如下: MyMazeMap.cpp 1 #include <iostream> 2 #include <Windows.h> 3 #include "MazeMap.h" 4 #include "Mazer.h" 5 using namespace std; 6 7 const int SUCCESS = 0; 8 9 int main() 10 { 11 int map[8

【每天一道算法题】走迷宫

输入描述: 输入包含多组数据. 每组数据包含一个10*10,由“#”和“.”组成的迷宫.其中“#”代表墙:“.”代表通路. 入口在第一行第二列:出口在最后一行第九列. 从任意一个“.”点都能一步走到上下左右四个方向的“.”点. 输出描述: 对应每组数据,输出从入口到出口最短需要几步. 输入例子: #.#########........##........##........##........##........##........##........##........#########.#

C语言算法之老鼠走迷宫

1.Algorithm Gossip: 老鼠走迷官(一) 说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法:老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选一个方向前进,无法前 进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是 递回的基本题. 代码: #include<stdio.h> #include<stdlib.h> int migo[7][

基于深度及广度优先搜索的迷宫问题的演示

1 时间复杂度分析 由于该图采用邻接矩阵存储,整个算法遍历的过程所花费的时间复杂度为该矩阵的N(row*col).而由于其需要分别访问已经定位,需要进行分别2次操作,如下: visited = new bool[col*row];//访问标记 for (i=0; i<row; i++) for (j=0; j<col; j++) visited[i*col+j] = false;//初始为未访问状态 position = new POSITION[col*row]; for (i=0; i&l

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10