記錄一個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()
}
}