]> www.fi.muni.cz Git - aoc.git/blob - 2022/23.pl
Day 25: examining the input
[aoc.git] / 2022 / 23.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5 use experimental 'multidimensional';
6
7 my @m = map { chomp; [ split // ] } <>;
8
9 my $xmax = $#{ $m[0] };
10 my $ymax = $#m;
11
12 my ($sx, $sy);
13 for my $y (0 .. $ymax) {
14         for my $x (0 .. $xmax) {
15                 if ($m[$y][$x] eq 'S') {
16                         $sx = $x; $sy = $y;
17                         $m[$y][$x] = 'a';
18                 }
19         }
20 }
21
22 my %seen;
23 my @q = [ $sx, $sy ];
24
25 while (@q) {
26         my $pt = shift @q;
27         my ($x, $y, @path) = @$pt;
28
29         say "walking ", join(' ', @$pt);
30
31         my $h = $m[$y][$x];
32
33         next if $seen{"$x,$y"}++;
34
35         if ($h eq 'E') {
36                 say "FOUND";
37                 say scalar @path, ': ', @path;
38                 exit 0;
39         }
40
41         for my $pt1 ([-1, 0], [1, 0], [0, -1], [0, 1]) {
42                 my ($dx, $dy) = @$pt1;
43                 my ($nx, $ny) = ($x+$dx, $y+$dy);
44                 next if $nx > $xmax || $nx < 0 || $ny > $ymax || $ny < 0;
45                 my $h1 = $m[$ny][$nx];
46                 $h1 = 'z' if $h1 eq 'E';
47                 say "trying $nx $ny $h $h1";
48                 next if ord($h1)-ord($h) > 1;
49                 push @q, [ $nx, $ny, @path, " $nx,$ny" ];
50         }
51 }