zoukankan      html  css  js  c++  java
  • Go实现广度迷宫算法

     迷宫算法

    广度搜索

    package main
    
    import (
        "fmt"
        "os"
    )
    
    
    func readMaze(filename string) [][]int {
        file, err := os.Open(filename)
        if err != nil {
            panic(err)
        }
        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.Fscanf(file, "%d", &maze[i][j])
            }
        }
    
        return maze
    }
    
    type point struct {
        i, j int
    }
    
    var dirs = [4]point {
        {-1, 0}, {0, -1}, {1, 0}, {0, 1},
    }
    
    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 < 0 || p.i > len(grid) {
            return 0, false
        }
        if p.j < 0 || p.j > len(grid) {
            return 0, false
        }
    
        return grid[p.i][p.j], true
    }
    
    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:]
    
            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
                }
    
                curSteps, _ := cur.at(steps)
                steps[next.i][next.i] = curSteps + 1
                Q = append(Q, next)
            }
        }
        return steps
    }
    
    func main() {
        maze := readMaze("...")
        steps := walk(maze, point{0, 0}, point{len(maze) - 1, len(maze[0]) - 1})
    
        for _, row := range steps {
            for _, val := range row {
                fmt.Printf("%3d", val)
            }
            fmt.Println()
        }
    }

    end

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    [Java算法分析与设计]--链式堆栈的设计
    Spring 单例模式和多例模式
    lucene_09_solrj的使用
    lucene_08_solr导入数据库数据
    lucene_07_solr使用IK分词器
    lucene_06_solr域
    lucene_05_solr配置
    lucene_04_解析语法查询
    lucene_03_索引的增删改查
    lucene_02_IKAnalyre
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12347056.html
Copyright © 2011-2022 走看看