1. 0- 1 组成的迷宫
    2. 从这个迷宫出去
    3. 0是可以行走的路
    4. 1是墙,无法通过
    5. 6 5
    6. 0 1 0 0 0
    7. 0 0 0 1 0
    8. 0 1 0 1 0
    9. 1 1 1 0 0
    10. 0 1 0 0 1
    11. 0 1 0 0 0
    12. 打印出行走的路线
    13. 0 0 4 5 6
    14. 1 2 3 0 7
    15. 2 0 4 0 8
    16. 0 0 0 10 9
    17. 0 0 12 11 0
    18. 0 0 13 12 13
    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(g [][]int) (int, bool)  {
        if p.i < 0 || p.i >= len(g) {
            return 0, false
        }
        if p.j < 0 || p.j >= len(g[p.i]) {
            return 0, false
        }
        return g[p.i][p.j], true
    }
    
    func walk(maze [][]int, start point, 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 val == 1 || !ok {
                    continue
                }
                val, ok = next.at(steps)
                if !ok || val != 0 {
                    continue
                }
                if next == start {
                    continue
                }
                curSteps, _ := cur.at(steps)
                steps[next.i][next.j] = curSteps + 1
    
                q = append(q, next)
            }
        }
        return steps
    }
    
    func main() {
        maze := readMaze("./maze.in")
        for _, row := range maze {
            for _, val := range row {
                fmt.Printf("%d ", val)
            }
            fmt.Println()
        }
        fmt.Println()
        steps := walk(maze, point{0, 0}, point{len(maze) -1, len(maze[0]) - 1})
        for _, row := range steps {
            for _, col := range row {
                fmt.Printf("%3d ", col)
            }
            fmt.Println()
        }
    }