tsp/cmd/maze/main.go
2024-04-10 01:07:37 -04:00

60 lines
1.2 KiB
Go

package main
import (
"flag"
"image"
"image/png"
"log"
"math/rand"
"os"
"time"
"smariot.com/tsp"
"smariot.com/tsp/maze"
)
func main() {
var (
w, h int
seed int64
imagePath string
)
flag.IntVar(&w, "w", 20, "width of the maze")
flag.IntVar(&h, "h", 15, "height of the maze")
flag.StringVar(&imagePath, "o", "maze.png", "output image path")
flag.Int64Var(&seed, "seed", rand.Int63(), "random seed")
flag.Parse()
t := time.Now()
m := maze.Make(image.Rect(0, 0, w, h), rand.New(rand.NewSource(seed)))
log.Printf("created maze in %v", time.Since(t))
t = time.Now()
path, err := tsp.Solve(maze.NewProblem(m.Size, m.Start, m.End, m.Right, m.Down), 0)
log.Printf("solved maze in %v", time.Since(t))
if err != nil {
log.Printf("failed to solve maze: %v", err)
}
t = time.Now()
image := m.Draw(path)
log.Printf("drawn maze in %v", time.Since(t))
f, err := os.Create(imagePath)
if err != nil {
log.Fatalf("failed to create image file: %v", err)
}
t = time.Now()
if err := png.Encode(f, image); err != nil {
log.Fatalf("failed to write image: %v", err)
}
log.Printf("wrote image in %v", time.Since(t))
if err := f.Close(); err != nil {
log.Fatalf("failed to close image file: %v", err)
}
}