#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11113757 use warnings; $_ = < $maxscore or $score == $maxscore and $minlength > @_) { $maxscore = $score; $minlength = @_; $best = "@_"; } } else { $maxscore = $score; $minlength = @_; $best = "@_"; } return; } for my $r ( 0 .. $maxrow ) { if( ++$visited[$r][$col] == 1 ) { $m[$r][$col] > 0 and try( @_, $r, $col, $score + $m[$r][$col] ); } --$visited[$r][$col]; } for my $c ( 0 .. $maxcol ) { if( ++$visited[$row][$c] == 1 ) { $m[$row][$c] > 0 and try( @_, $row, $c, $score + $m[$row][$c] ); } --$visited[$row][$c]; } } sub directions { my ($rowfrom, $colfrom, $rowto, $colto) = @_; if( $rowfrom != $rowto ) { return +($rowfrom < $rowto ? 'down' : 'up') . (abs($rowfrom - $rowto) > 1 ? '-slide' : ''); } else { return +($colfrom < $colto ? 'right' : 'left') . (abs($colfrom - $colto) > 1 ? '-slide' : ''); } } #### best path: up-slide down-slide left-slide up-slide right down right-slide down-slide left up-slide down-slide down-slide left up-slide = 0+9+3+1+1+4+3+17+1+2+5+3+4+8+10 = 71