Piotr Czajkowski há 2 anos atrás
pai
commit
05f36f7aef
1 ficheiros alterados com 70 adições e 1 exclusões
  1. 70 1
      09/code.go

+ 70 - 1
09/code.go

@@ -72,6 +72,75 @@ func part1(input [][]int) (int, [][]int) {
 	return sum, lowPoints
 }
 
+type point struct {
+	x, y int
+}
+
+func getNeighbors(input [][]int, x, y int) []point {
+	var neighbors []point
+	if x-1 >= 0 && input[x-1][y] != 9 {
+		neighbors = append(neighbors, point{x - 1, y})
+	}
+
+	if x+1 < len(input) && input[x+1][y] != 9 {
+		neighbors = append(neighbors, point{x + 1, y})
+	}
+
+	if y-1 >= 0 && input[x][y-1] != 9 {
+		neighbors = append(neighbors, point{x, y - 1})
+	}
+
+	if y+1 < len(input[0]) && input[x][y+1] != 9 {
+		neighbors = append(neighbors, point{x, y + 1})
+	}
+
+	return neighbors
+}
+
+func getBasin(input [][]int, x int, y int) []point {
+	var basin []point
+	neighbors := getNeighbors(input, x, y)
+
+	checked := make(map[point]bool)
+	for {
+		if len(neighbors) == 0 {
+			break
+		}
+
+		var next []point
+		for _, neighbor := range neighbors {
+			if checked[neighbor] {
+				continue
+			}
+
+			checked[neighbor] = true
+			basin = append(basin, neighbor)
+			next = append(next, getNeighbors(input, neighbor.x, neighbor.y)...)
+		}
+
+		neighbors = next
+	}
+
+	return basin
+}
+
+func getBasins(input [][]int, lowPoints [][]int) [][]point {
+	var basins [][]point
+
+	for _, lowPoint := range lowPoints {
+		basin := getBasin(input, lowPoint[0], lowPoint[1])
+		basins = append(basins, basin)
+	}
+
+	return basins
+}
+
+func part2(input [][]int, lowPoints [][]int) int {
+	basins := getBasins(input, lowPoints)
+	fmt.Println(basins)
+	return 0
+}
+
 func main() {
 	if len(os.Args) < 2 {
 		log.Fatal("Please provide a file name as argument")
@@ -80,5 +149,5 @@ func main() {
 	input := readInput(os.Args[1])
 	sum, lowPoints := part1(input)
 	fmt.Println("Part 1:", sum)
-	fmt.Println(lowPoints)
+	part2(input, lowPoints)
 }