]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day10 - part 2 optimisation
authoralex <null>
Sun, 10 Dec 2023 21:02:07 +0000 (22:02 +0100)
committeralex <null>
Sun, 10 Dec 2023 21:02:07 +0000 (22:02 +0100)
On commence à chercher depuis l'intérieur (et non l'extérieur).
Ça reste long comme solution, mais on gagne déjà un peu de temps.

src/day10.rs

index bc98b110e2d30338f0e11c4441162089e45b8d49..4b16c8a638cbb42f55e8397f7eaf79a2e1223b16 100644 (file)
@@ -396,13 +396,30 @@ fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
         count
     }
 
-    let start = (1, 1);
-    let count_outside = travel(start, &mut seen, map_extended, &frontier_coord);
+    // on cherche une case à l'intérieur
+    // on sait que les lignes intermédiaires ne contiennent que de '|' et de ' '
+    // on parcourt les lignes intermédiaires et on s'arrête dès qu'on trouve
+    // la frontière et une limite '|'
+    let mut start = (1, 1);
+    for r in (1..map_extended.len()).step_by(2) {
+        let mut is_inside = false;
+        for c in (0..map_extended[0].len()).step_by(2) {
+            if map_extended[r][c] == '|' && is_frontier(&frontier_coord, (r, c)) {
+                is_inside = !is_inside;
+                start = (r, c + 1);
+                break;
+            }
+        }
+        if start != (1, 1) {
+            break;
+        }
+    }
+    let count_inside = travel(start, &mut seen, map_extended, &frontier_coord);
 
     // penser à retirer 2 lignes et 2 colonnes (les bordures en plus)
     let total: u32 = (puzzle.map[0].len() - 2) as u32 * (puzzle.map.len() - 2) as u32;
 
-    let res = total - puzzle_frontier_length - count_outside;
+    let res = count_inside;
     Ok(res)
 }