路径和:两种方法

作者:Moritz Lenz

https://projecteuler.net/problem=81

在下面的 5 x 5 矩阵中,从左上角到右下角的最短路径和为 2427,该路径仅通过向右和向下移动,并以粗体显示。

131 673 234 103 18⎞ ⎜201 96 342 965 150⎟ ⎜630 803 746 422 111⎟ ⎜537 699 497 121 956⎟ ⎝805 732 524 37 331

在 matrix.txt 文件中找到从左上角到右下角的最短路径和,该文件是一个 31K 的文本文件,包含一个 80 x 80 的矩阵,路径仅通过向右和向下移动。

源代码:prob081-moritz.pl

use v6;

my @m;

my $matrix-file = $*SPEC.catdir($*PROGRAM-NAME.IO.dirname, 'matrix.txt');
my $f = open $matrix-file or die "Can't open file for reading: $!";
for $f.lines -> $line {
    @m.push: $line.comb(/\d+/).Array.item;
}
$f.close;

my ($max-x, $max-y) = +@m[0], +@m;

@m[0][$_] += @m[0][$_-1] for 1..$max-x-1;
@m[$_][0] += @m[$_-1][0] for 1..$max-y-1;

for 1..$max-y-1 -> $y {
    for 1..$max-x-1 -> $x {
        @m[$y][$x] += @m[$y-1][$x] min @m[$y][$x-1];
    }
}

say @m[*-1][*-1];