#!/usr/bin/perl
# 3/316 by Dijkstra shortest path , w/o using priority queue
@s = qw{13457689768914512071934123457 G4578901258901212890361125312
37890423076834712378998725463
16890102569615902061456259893
34582934765923812893461515232
57896123896741378915691551697
89013897456123457162501835479
21389046013845610034623405686
8902346203948612341356362342S};
for $j (0..$nj-1) {
for $i (0..$ni-1) {
$c = $t[$j][$i];
$node{"$j $i"} = ~0; # Huge int
if ($c =~ /[SG]/) {
${$c} = "$j $i";
$node{"$j $i"} = 0 if $c eq 'S';
}
for ([-1,0],[0,-1],[1,0],[0,1]) {
$ii = $i + $$_[0];
$jj = $j + $$_[1];
if (0 <= $ii and $ii < $ni and
0 <= $jj and $jj < $nj) {
$edge{"$jj $ii"}{"$j $i"} = $c;
}
}
}
}
use List::Util min;
while (@ss = sort{$node{$a} <=> $node{$b}} keys %node) { $s = @ss[0];
$c = $node{$s};
$path{$s} = $c;
for $d (keys %{$edge{$s}}) { $node{$d} = min($node{$d}, $c + $edge{$s}{$d});
}
}
print "$S => $G: $path{$G}\n";
IyEvdXNyL2Jpbi9wZXJsCiMgMy8zMTYgYnkgRGlqa3N0cmEgc2hvcnRlc3QgcGF0aCAsIHcvbyB1c2luZyBwcmlvcml0eSBxdWV1ZQpAcyA9IHF3ezEzNDU3Njg5NzY4OTE0NTEyMDcxOTM0MTIzNDU3CglHNDU3ODkwMTI1ODkwMTIxMjg5MDM2MTEyNTMxMgoJMzc4OTA0MjMwNzY4MzQ3MTIzNzg5OTg3MjU0NjMKCTE2ODkwMTAyNTY5NjE1OTAyMDYxNDU2MjU5ODkzCgkzNDU4MjkzNDc2NTkyMzgxMjg5MzQ2MTUxNTIzMgoJNTc4OTYxMjM4OTY3NDEzNzg5MTU2OTE1NTE2OTcKCTg5MDEzODk3NDU2MTIzNDU3MTYyNTAxODM1NDc5CgkyMTM4OTA0NjAxMzg0NTYxMDAzNDYyMzQwNTY4NgoJODkwMjM0NjIwMzk0ODYxMjM0MTM1NjM2MjM0MlN9OwoKJG5qID0gQHM7CiRuaSA9IGxlbmd0aCAkc1swXTsKQHQgPSBtYXB7W3NwbGl0JyddfSBAczsKCmZvciAkaiAoMC4uJG5qLTEpIHsKICBmb3IgJGkgKDAuLiRuaS0xKSB7CiAgICAkYyA9ICR0WyRqXVskaV07CiAgICAkbm9kZXsiJGogJGkifSA9IH4wOyAjIEh1Z2UgaW50CiAgICBpZiAoJGMgPX4gL1tTR10vKSB7CiAgICAgICR7JGN9ID0gIiRqICRpIjsKICAgICAgJG5vZGV7IiRqICRpIn0gPSAwIGlmICRjIGVxICdTJzsKICAgIH0KICAgIGZvciAoWy0xLDBdLFswLC0xXSxbMSwwXSxbMCwxXSkgewogICAgICAkaWkgPSAkaSArICQkX1swXTsKICAgICAgJGpqID0gJGogKyAkJF9bMV07CiAgICAgIGlmICgwIDw9ICRpaSBhbmQgJGlpIDwgJG5pIGFuZAoJICAwIDw9ICRqaiBhbmQgJGpqIDwgJG5qKSB7CgkkZWRnZXsiJGpqICRpaSJ9eyIkaiAkaSJ9ID0gJGM7CiAgICAgIH0KICAgIH0KICB9Cn0KCnVzZSBMaXN0OjpVdGlsIG1pbjsKd2hpbGUgKEBzcyA9IHNvcnR7JG5vZGV7JGF9IDw9PiAkbm9kZXskYn19IGtleXMgJW5vZGUpIHsKICAkcyA9IEBzc1swXTsKICAkYyA9ICRub2RleyRzfTsKICAkcGF0aHskc30gPSAkYzsKICBkZWxldGUgJG5vZGV7JHN9OwogIGZvciAkZCAoa2V5cyAleyRlZGdleyRzfX0pIHsKICAgIG5leHQgdW5sZXNzIGV4aXN0cyAkbm9kZXskZH07CiAgICAkbm9kZXskZH0gPSBtaW4oJG5vZGV7JGR9LCAkYyArICRlZGdleyRzfXskZH0pOwogIH0KfQpwcmludCAiJFMgPT4gJEc6ICRwYXRoeyRHfVxuIjs=