var checkerBoard = [ undefined , [ undefined , null , null , 5 , null , null ] , [ undefined , null , 6 , 7 , 0 , null ] , [ undefined , 3 , 5 , 7 , 8 , 2 ] , [ undefined , 7 , 6 , 1 , 1 , 4 ] , [ undefined , 6 , 7 , 4 , 7 , 8 ] ] ;
var n = 5 ;
var q = [ undefined , [ ] , [ ] , [ ] , [ ] , [ ] ] ;
var p = [ undefined , [ ] , [ ] , [ ] , [ ] , [ ] ] ;
function c( i, j) {
return checkerBoard[ i] [ j] ;
}
function minCost( i, j) {
if ( j < 1 || j > n) { return Infinity ; }
else if ( i === 1 ) { return c( i, j) ; }
else { return Math .min ( minCost( i - 1 , j - 1 ) , Math .min ( minCost( i - 1 , j) , minCost( i - 1 , j + 1 ) ) ) + c( i, j) ; }
}
function computeShortestPathArrays( ) {
for ( var x = 1 ; x <= n; x++ ) {
q[ 1 ] [ x] = c( 1 , x) ;
}
for ( var y = 1 ; y <= n; y++ ) {
q[ y] [ 0 ] = Infinity ;
q[ y] [ n + 1 ] = Infinity ;
}
for ( var y = 2 ; y <= n; y++ ) {
for ( var x = 1 ; x <= n; x++ ) {
var m = Math .min ( q[ y - 1 ] [ x - 1 ] , Math .min ( q[ y - 1 ] [ x] , q[ y - 1 ] [ x + 1 ] ) ) ;
q[ y] [ x] = m + c( y, x) ;
if ( m === q[ y - 1 ] [ x - 1 ] ) {
p[ y] [ x] = - 1 ;
}
else if ( m === q[ y - 1 ] [ x] ) {
p[ y] [ x] = 0 ;
}
else {
p[ y] [ x] = 1 ;
}
}
}
}
function computeShortestPath( ) {
computeShortestPathArrays( ) ;
var minIndex = 1 ;
var min = q[ n] [ 1 ] ;
for ( var i = 2 ; i <= n; i++ ) {
if ( q[ n] [ i] < min) {
minIndex = i;
min = q[ n] [ i] ;
}
}
printPath( n, minIndex) ;
}
function printPath( y, x) {
process.stdout .write ( "" + x) ;
process.stdout .write ( "<-" ) ;
if ( y === 2 ) {
process.stdout .write ( "" + ( ( x) + p[ y] [ x] ) ) ;
console.log ( "" ) ;
}
else { printPath( y - 1 , x + p[ y] [ x] ) }
}
computeShortestPath( ) ;
console.log ( "" ) ;
console.log ( /*"\narray p == " +*/ p) ;
console.log ( /*"array q == " +*/ q) ;
console.log ( /*"array checkerBoard == " +*/ checkerBoard) ;
CnZhciBjaGVja2VyQm9hcmQgPSBbdW5kZWZpbmVkLCBbdW5kZWZpbmVkLCBudWxsLCBudWxsLCA1LCBudWxsLCBudWxsXSwgW3VuZGVmaW5lZCwgbnVsbCwgNiwgNywgMCwgbnVsbF0sIFt1bmRlZmluZWQsIDMsIDUsIDcsIDgsIDJdLCBbdW5kZWZpbmVkLCA3LCA2LCAxLCAxLCA0XSwgW3VuZGVmaW5lZCwgNiwgNywgNCwgNywgOF1dOwp2YXIgbiA9IDU7Cgp2YXIgcSA9IFt1bmRlZmluZWQsIFtdLFtdLFtdLFtdLFtdXTsKdmFyIHAgPSBbdW5kZWZpbmVkLCBbXSxbXSxbXSxbXSxbXV07CgoKCmZ1bmN0aW9uIGMoaSwgaikgewogICAgcmV0dXJuIGNoZWNrZXJCb2FyZFtpXVtqXTsKfQoKZnVuY3Rpb24gbWluQ29zdChpLCBqKSB7CiAgICBpZiAoaiA8IDEgfHwgaiA+IG4pIHsgcmV0dXJuIEluZmluaXR5OyB9CiAgICBlbHNlIGlmIChpID09PSAxKSB7IHJldHVybiBjKGksIGopOyB9CiAgICBlbHNlIHsgcmV0dXJuIE1hdGgubWluKG1pbkNvc3QoaSAtIDEsIGogLSAxKSwgTWF0aC5taW4obWluQ29zdChpIC0gMSwgaiksIG1pbkNvc3QoaSAtIDEsIGogKyAxKSkpICsgYyhpLCBqKTsgfQogfQoKZnVuY3Rpb24gY29tcHV0ZVNob3J0ZXN0UGF0aEFycmF5cygpIHsKICAgIAogICAgZm9yICh2YXIgeCA9IDE7IHggPD0gbjsgeCsrKXsKICAgICAgICBxWzFdW3hdID0gYygxLCB4KTsKICAgIH0KICAgIGZvciAodmFyIHkgPSAxOyB5IDw9IG47IHkrKyl7CiAgICAgICAgcVt5XVswXSA9IEluZmluaXR5OwogICAgICAgIHFbeV1bbiArIDFdID0gSW5maW5pdHk7CiAgICB9CiAgICBmb3IgKHZhciB5ID0gMjsgeSA8PSBuOyB5KyspewogICAgICAgIGZvciAodmFyIHggPSAxOyB4IDw9IG47IHgrKyl7CiAgICAgICAgICAgIHZhciBtID0gTWF0aC5taW4ocVt5IC0gMV1bIHggLSAxXSwgTWF0aC5taW4ocVt5IC0gMV1beF0sIHFbeSAtIDFdW3ggKyAxXSkpOwogICAgICAgICAgICBxW3ldW3hdID0gbSArIGMoeSwgeCk7CgogICAgICAgICAgICBpZiAobSA9PT0gcVt5IC0gMV1beCAtIDFdKSB7CiAgICAgICAgICAgICAgICBwW3ldW3hdID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobSA9PT0gcVt5IC0gMV1beF0pIHsKICAgICAgICAgICAgICAgIHBbeV1beF0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcFt5XVt4XSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGNvbXB1dGVTaG9ydGVzdFBhdGgoKSB7IAogICAgCiAgICBjb21wdXRlU2hvcnRlc3RQYXRoQXJyYXlzKCk7CiAgICB2YXIgbWluSW5kZXggPSAxOwogICAgdmFyIG1pbiA9IHFbbl1bMV07CiAgICBmb3IgKHZhciBpID0gMjsgaSA8PSBuOyBpKyspewogICAgICAgIGlmIChxW25dW2ldIDwgbWluKSB7CiAgICAgICAgICAgIG1pbkluZGV4ID0gaTsKICAgICAgICAgICAgbWluID0gcVtuXVtpXTsKICAgICAgICB9ICAgICAgICAKICAgIH0KICAgIHByaW50UGF0aChuLCBtaW5JbmRleCk7Cn0KCmZ1bmN0aW9uIHByaW50UGF0aCh5LCB4KSB7IAogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoIiIgKyB4KTsKICAgIAogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoIjwtIik7CiAgICBpZiAoeSA9PT0gMikgewogICAgICAgIAogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCIiICsgKCh4KSArIHBbeV1beF0pKTsKICAgICAgICBjb25zb2xlLmxvZygiIik7CiAgICB9CiAgICBlbHNlIHsgcHJpbnRQYXRoKHkgLSAxLCB4ICsgcFt5XVt4XSkgfQoKfQoKY29tcHV0ZVNob3J0ZXN0UGF0aCgpOwoKY29uc29sZS5sb2coIiIpOwoKY29uc29sZS5sb2coLyoiXG5hcnJheSBwID09ICIgKyovIHApOwoKY29uc29sZS5sb2coLyoiYXJyYXkgcSA9PSAiICsqLyBxKTsKCmNvbnNvbGUubG9nKC8qImFycmF5IGNoZWNrZXJCb2FyZCA9PSAiICsqLyBjaGVja2VyQm9hcmQpOw==
stdout
3<-4<-5<-4<-5
[ undefined,
[],
[ , 1, 1, 1, 1, 1 ],
[ , 0, -1, 1, 0, -1 ],
[ , 0, -1, -1, 1, 0 ],
[ , 1, 1, 1, 0, -1 ] ]
[ undefined,
[ Infinity, null, null, 5, null, null, Infinity ],
[ Infinity, 0, 6, 7, 0, 0, Infinity ],
[ Infinity, 3, 5, 7, 8, 2, Infinity ],
[ Infinity, 10, 9, 6, 3, 6, Infinity ],
[ Infinity, 15, 13, 7, 10, 11, Infinity ] ]
[ undefined,
[ undefined, null, null, 5, null, null ],
[ undefined, null, 6, 7, 0, null ],
[ undefined, 3, 5, 7, 8, 2 ],
[ undefined, 7, 6, 1, 1, 4 ],
[ undefined, 6, 7, 4, 7, 8 ] ]