package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func findTrailheads(tmap [][]int) [][]int { trailheadsPositions := [][]int{} for i:=range tmap { for j:=range tmap[i] { if tmap[i][j] == 0 { trailheadsPositions = append(trailheadsPositions, []int{i,j}) } } } return trailheadsPositions } func nextSteps(tmap [][]int, currentPosition []int) [][]int { paths := [][]int{} if currentPosition[0] - 1 >= 0 && tmap[currentPosition[0]-1][currentPosition[1]] == tmap[currentPosition[0]][currentPosition[1]] + 1 { paths = append(paths, []int{currentPosition[0]-1,currentPosition[1]}) } if currentPosition[0] + 1 < len(tmap) && tmap[currentPosition[0]+1][currentPosition[1]] == tmap[currentPosition[0]][currentPosition[1]] + 1 { paths = append(paths, []int{currentPosition[0]+1,currentPosition[1]}) } if currentPosition[1] + 1 < len(tmap[currentPosition[0]]) && tmap[currentPosition[0]][currentPosition[1]+1] == tmap[currentPosition[0]][currentPosition[1]] + 1 { paths = append(paths, []int{currentPosition[0],currentPosition[1]+1}) } if currentPosition[1] - 1 >= 0 && tmap[currentPosition[0]][currentPosition[1]-1] == tmap[currentPosition[0]][currentPosition[1]] + 1 { paths = append(paths, []int{currentPosition[0],currentPosition[1]-1}) } return paths } func calcPath(tmap [][]int, start []int) [][]int { path := [][]int{start} for i:=1;i<=9;i++ { nextStep := nextSteps(tmap,) if len(nextStep) > 0 { break } else { path = append(path, nextStep...) } } return path } func main() { file, _ := os.Open("test") // file, _ := os.Open("input") defer file.Close() scanner := bufio.NewScanner(file) tmap := [][]int{} for scanner.Scan() { line := scanner.Text() level := strings.Split(line,"") levelInt := []int{} for i:=range level { levelInteger, _ := strconv.Atoi(level[i]) levelInt = append(levelInt, levelInteger) } tmap = append(tmap, levelInt) } trailheadsPositions := findTrailheads(tmap) for i := range trailheadsPositions { path := calcPath(tmap,trailheadsPositions[i]) fmt.Println(path) if len(path) == 10 { } } }