60 lines
1.2 KiB
Go
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)
|
|
}
|
|
}
|