Non recursive Queue/Tree solution implementation

This commit is contained in:
semblanceofsense 2025-02-01 15:09:47 -07:00
parent fe768dadc4
commit 5644b23e33
4 changed files with 77 additions and 27 deletions

View File

@ -64,18 +64,7 @@ func Run(BotToken string) {
outputmaze.EditMaze(points, "/tmp/maze.png", "/tmp/outputmaze.png") outputmaze.EditMaze(points, "/tmp/maze.png", "/tmp/outputmaze.png")
}}}} }}}}
if responseData != "" { if responseData == "" {
err = s.InteractionRespond(
i.Interaction,
&discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: 1 << 6,
Content: responseData,
},
},
)
} else {
fileName := "/tmp/outputmaze.png" fileName := "/tmp/outputmaze.png"
f, _ := os.Open(fileName) f, _ := os.Open(fileName)
defer f.Close() defer f.Close()
@ -93,12 +82,27 @@ func Run(BotToken string) {
}, },
}, },
) )
}
if err != nil { if err != nil {
fmt.Println(err) if strings.Contains(err.Error(), "413") {
responseData = "Solution file is too large!"
} else {
responseData = err.Error()
} }
} }
}) if responseData != "" {
err = s.InteractionRespond(
i.Interaction,
&discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: 1 << 6,
Content: responseData,
},
},
)
}
}
}})
discord.AddHandler(func ( discord.AddHandler(func (
s *discordgo.Session, s *discordgo.Session,
@ -141,7 +145,11 @@ func Run(BotToken string) {
}, },
}) })
if err != nil { if err != nil {
fmt.Println(err) if strings.Contains(err.Error(), "413") {
s.ChannelMessageSendReply(m.ChannelID, "Solution file is too large!", m.Reference())
} else {
s.ChannelMessageSendReply(m.ChannelID, err.Error(), m.Reference())
}
} }
} }
} }

View File

@ -22,7 +22,8 @@ Pixel types:
type Point struct { type Point struct {
X int; X int;
Y int; Y int;
Value int Value int;
Parent *Point
} }
type Maze [][]Point type Maze [][]Point

View File

@ -2,12 +2,14 @@ package solvemaze
import ( import (
"mazesolver/internal/getmaze" "mazesolver/internal/getmaze"
"mazesolver/util/queue"
) )
func FindPath(maze getMaze.Maze) []getMaze.Point { func FindPath(maze getMaze.Maze) []getMaze.Point {
returnSlice := make([]getMaze.Point, 0) returnSlice := make([]getMaze.Point, 0)
debugMaze := GetDebugMaze(maze) //debugMaze := GetDebugMaze(maze)
findPathRecursive(maze[1][1], maze, &returnSlice, debugMaze) //findPathRecursive(maze[1][1], maze, &returnSlice, debugMaze)
findPathNonRecursive(maze, maze[1][1], &returnSlice)
return returnSlice return returnSlice
} }
@ -49,3 +51,42 @@ func GetDebugMaze(maze getMaze.Maze) getMaze.Maze {
} }
return a return a
} }
func findPathNonRecursive(maze getMaze.Maze, root getMaze.Point, slice *[]getMaze.Point) {
next := buildMaze(maze, root)
for next != nil {
*slice = append(*slice, *next)
next = next.Parent
}
}
func buildMaze(maze getMaze.Maze, root getMaze.Point) *getMaze.Point {
Q := make(queue.Queue[getMaze.Point], 0)
root.Value = -1
Q.Enqueue(root)
for len(Q) > 0 {
v := Q.Dequeue()
if v.Value == 9 {
return (&v)
}
for _, w := range getAdjacent(v, maze) {
if (w.Value == 0 || w.Value == 9) {
maze[w.Y][w.X].Value = -1
w.Parent = &v
Q.Enqueue(w)
}
}
}
return nil
}
func contains(maze getMaze.Maze, val int) bool {
for _, v := range maze {
for _, vv := range v {
if vv.Value == val {
return true
}
}
}
return false
}

View File

@ -7,18 +7,18 @@ type QueueInterface interface {
type Queue[T any] []T type Queue[T any] []T
func (q Queue[T]) Enqueue(v T) { func (q *Queue[T]) Enqueue(v T) {
q = append(q, v) *q = append(*q, v)
} }
func (q Queue[T]) Dequeue() T { func (q *Queue[T]) Dequeue() T {
x := q[0] x := (*q)[0]
q = q[1:] *q = (*q)[1:]
return x return x
} }
func (q Queue[T]) IsEmpty() bool { func (q *Queue[T]) IsEmpty() bool {
if len(q) == 0 { if len(*q) == 0 {
return true return true
} }
return false; return false;