美文网首页
广度优先算法走迷宫

广度优先算法走迷宫

作者: Mr_Arvin | 来源:发表于2020-04-15 09:53 被阅读0次

    记录一个demo,方便以后查阅

    package main
    
    import (
        "fmt"
        "os"
    )
    
    type point struct {
        i, j int
    }
    
    func main() {
        //读取文件
        file, err := os.Open("./maze.in")
        defer file.Close()
        if err != nil {
            fmt.Errorf("read file fail: %v", err)
        }
        //获取迷宫地图的规格
        var row, col int
        fmt.Fscanf(file, "%d %d", &row, &col)
        //读取迷宫地图
        var maze = make([][]int, row)
        for i := range maze {
            maze[i] = make([]int, col)
            for j, val := range maze[i] {
                fmt.Fscanf(file, "%d", &val)
                maze[i][j] = val
            }
        }
        //生成一个迷宫路线图steps
        var steps = make([][]int, len(maze))
        for i := range steps {
            steps[i] = make([]int, len(maze[i]))
        }
        //定义起始位置和结束位置
        start := point{0, 0}
        end := point{len(maze) - 1, len(maze[0]) - 1}
        //定义方向向量 逆时针(上左下右)
        direction := []point{
            {-1, 0},
            {0, -1},
            {1, 0},
            {0, 1},
        }
        //探索起始点,发现下一步
        var Q []point
        Q = append(Q, start)
        for {
            origin := Q[0]
            Q = Q[1:]
            //判断是否探索到终点
            if origin == end {
                break
            }
            //逆时针方向探索队列中取出的点
            for _, d := range direction {
                next := point{origin.i + d.i, origin.j + d.j}
                //判断是否越界
                if next.i < 0 || next.i >= len(maze) {
                    continue
                }
                if next.j < 0 || next.j >= len(maze[0]) {
                    continue
                }
                //判断是否为起始位置或者为墙壁
                if next == start || maze[next.i][next.j] == 1 {
                    continue
                }
                //判断是否已经探索过
                if steps[next.i][next.j] != 0 {
                    continue
                }
                //画出路线图
                steps[next.i][next.j] = steps[origin.i][origin.j] + 1
                //把新发现的点加入队列中等待探索
                Q = append(Q, next)
            }
        }
        //打印线路结果
        for _, step := range steps {
            for _, v := range step {
                fmt.Printf("%3d", v)
            }
            fmt.Println()
        }
    }
    
    

    相关文章

      网友评论

          本文标题:广度优先算法走迷宫

          本文链接:https://www.haomeiwen.com/subject/imyqvhtx.html