package main
import (
"fmt"
"os"
)
type MazeNode2 struct {
x, y int
distance int
}
func put2(maze *[]MazeNode2, m MazeNode2) {
*maze = append(*maze, m)
}
func pop6(maze *[]MazeNode2) MazeNode2 {
data := (*maze)[0]
*maze = (*maze)[1:]
return data
}
func mazeBFS2(maze [][]int, x, y int, distance int) {
queue := []MazeNode2{{x, y, distance}}
put2(&queue, MazeNode2{x, y, distance})
for len(queue) > 0 {
//ogQueue := queue[0]
//queue = queue[1:]
ogQueue := pop6(&queue)
if ogQueue.x == 8 && ogQueue.y == 8 {
fmt.Println(ogQueue.x, ogQueue.y)
for i := 0; i < len(maze); i++ {
fmt.Println(maze[i])
}
fmt.Println(ogQueue.distance)
fmt.Println("!!!Yeah!!!")
os.Exit(0)
}
maze[ogQueue.y][ogQueue.x] = 2
//fmt.Println(ogQueue.y, ogQueue.x)
dir := [][]int{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}
for _, dir := range dir {
nx, ny := ogQueue.x+dir[0], ogQueue.y+dir[1]
if nx == -1 || ny == -1 || nx == len(maze) || ny == len(maze[0]) {
continue
}
if maze[ny][nx] != 0 {
continue
}
// 재귀함수 콜을 하면 무한루프에 빠질수있음. 그 이유는 "queue"에 계속해서 추가되기 때문
// mazeBFS(maze, nx, ny)
//queue = append(queue, &MazeNode2{nx, ny, distance})
//fmt.Println(queue[x], queue[y])
put2(&queue, MazeNode2{nx, ny, ogQueue.distance + 1})
}
}
}
func main() {
maze := [][]int{
{0, 1, 0, 1, 0, 0, 0, 0, 1},
{0, 0, 0, 1, 0, 1, 0, 1, 1},
{1, 0, 1, 0, 0, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 1},
{0, 1, 1, 0, 0, 0, 1, 1, 0},
{0, 0, 1, 0, 1, 0, 1, 0, 0},
{0, 1, 0, 0, 1, 1, 0, 0, 1},
{0, 1, 0, 1, 0, 0, 0, 1, 1},
{1, 1, 0, 0, 0, 1, 0, 0, 0},
}
mazeBFS2(maze, 0, 0, 0)
}