<?php
SUBWAY => 'едешь на метро' ,
FOOT => 'идешь пешком' ,
BUS => 'едешь на автобусе'
) ;
$startPoint = 'pet' ; // Петроградская
$endPoint = 'nov' ; // Новая Голландия
'pet' => 'ст. м. Петроградская' ,
'chk' => 'ст. м. Чкаловская' ,
'gor' => 'ст. м. Горьковская' ,
'spo' => 'ст. м. Спортивная' ,
'vas' => 'ст. м. Василеостровская' ,
'kre' => 'Петропавловская крепость' ,
'let' => 'Летний сад' ,
'dvo' => 'Дворцовая площадь' ,
'isa' => 'Исакиевский собор' ,
'nov' => 'Новая Голландия' ,
'ras' => 'Дом Раскольникова' ,
'gos' => 'Гостиный Двор' ,
'sen' => 'Сенная Площадь' ,
'vla' => 'ст. м. Владимирская' ,
'vit' => 'Витебский вокзал' ,
'teh' => 'Технологический Институт'
) ;
'chk' => canGet( 10 , BUS) ,
'gor' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 10 , BUS) ,
'spo' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 3 , BUS) ,
'kre' => canGet( 5 , FOOT) ,
'gos' => canGet( 6 , SUBWAY)
) ,
'chk' => canGet( 3 , SUBWAY) ,
'vas' => canGet( 10 , BUS) ,
'sen' => canGet( 7 , SUBWAY)
) ,
'spo' => canGet( 10 , BUS) ,
'gos' => canGet( 7 , SUBWAY) ,
'nov' => canGet( 11 , FOOT)
) ,
'gor' => canGet( 5 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'gos' => canGet( 7 , FOOT)
) ,
'isa' => canGet( 6 , FOOT) ,
'gos' => canGet( 6 , FOOT) ,
'let' => canGet( 6 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'nov' => canGet( 5 , FOOT)
) ,
'vas' => canGet( 11 , FOOT) ,
'isa' => canGet( 5 , FOOT) ,
'ras' => canGet( 7 , BUS)
) ,
'nov' => canGet( 7 , BUS) ,
'sen' => canGet( 3 , FOOT)
) ,
'vas' => canGet( 7 , SUBWAY) ,
'sen' => canGet( 3 , SUBWAY) ,
'dvo' => canGet( 6 , FOOT) ,
'gor' => canGet( 6 , SUBWAY) ,
'let' => canGet( 7 , FOOT) ,
'vla' => canGet( 7 , FOOT)
) ,
'ras' => canGet( 3 , FOOT) ,
'spo' => canGet( 7 , SUBWAY) ,
'gos' => canGet( 3 , SUBWAY) ,
'vla' => canGet( 4 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 4 , SUBWAY) ,
'gos' => canGet( 7 , FOOT) ,
'vit' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 2 , SUBWAY) ,
'vla' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 3 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY)
)
) ;
$start = "nov" ;
$target = "kre" ;
$pathDone = [ $start ] ;
$time = 0 ;
$bestPath = findBestPath( $paths , $pathDone , $time , $start , $target ) ;
echo "Начальная точка: $pointNames [$start ]<br>" ;
for ( $i = 1 ; $i < count ( $bestPath [ 'path' ] ) ; $i ++ ) { $cur = $bestPath [ 'path' ] [ $i - 1 ] ;
$curFull = $pointNames [ $bestPath [ 'path' ] [ $i - 1 ] ] ;
$next = $bestPath [ 'path' ] [ $i ] ;
$nextFull = $pointNames [ $bestPath [ 'path' ] [ $i ] ] ;
$tr = $transportName [ $paths [ $cur ] [ $next ] [ 'by' ] ] ;
$ti = $paths [ $cur ] [ $next ] [ 'time' ] ;
echo "Из неё $tr до точки $nextFull $ti мин.<br>" ;
if ( $i == count ( $bestPath [ 'path' ] ) - 1 ) { $time = $bestPath [ 'time' ] ;
echo "В итоге ты попадёшь в точку $nextFull за $time мин. Приятной поездки!" ;
}
}
function findBestPath( $paths , $pathDone , $time , $start , $target ) {
$bestPath = [
'path' => [ ] ,
'time' => 999999
] ;
$result = [ ] ;
$foundPaths = findPaths( $paths , $pathDone , $time , $start , $target ) ;
for ( $i = 0 ; $i < count ( $foundPaths ) ; $i += 2 ) { $tempArray = [ ] ;
$tempArray [ 'path' ] = $foundPaths [ $i ] ;
$tempArray [ 'time' ] = $foundPaths [ $i + 1 ] ;
}
foreach ( $result as $path ) {
if ( $path [ "time" ] < $bestPath [ "time" ] ) {
$bestPath = $path ;
}
}
return $bestPath ;
}
function findPaths( $paths , $pathDone , $time , $point , $target ) {
$result = [ ] ;
$foundPaths = [ ] ;
$result [ 'path' ] = $pathDone ;
$result [ 'time' ] = $time + $paths [ $point ] [ $target ] [ 'time' ] ;
return $result ;
} else {
foreach ( $paths [ $point ] as $connectedPoint => $connectedPointData ) {
if ( in_array ( $connectedPoint , $pathDone ) ) { continue ;
} else {
$newPathDone = $pathDone ;
$result = findPaths( $paths , $newPathDone , $time + $connectedPointData [ 'time' ] , $connectedPoint , $target ) ;
} elseif ( count ( $result ) > 1 ) { foreach ( $result as $path ) {
}
} else {
}
}
}
}
}
return $foundPaths ;
}
function canGet( $time , $byWhat ) {
return array ( 'time' => $time , 'by' => $byWhat ) ; }
PD9waHAKIAplcnJvcl9yZXBvcnRpbmcoLTEpOwptYl9pbnRlcm5hbF9lbmNvZGluZygndXRmLTgnKTsKIApkZWZpbmUoJ1NVQldBWScsICdzdWInKTsKZGVmaW5lKCdGT09UJywgJ2Zvb3QnKTsKZGVmaW5lKCdCVVMnLCAnYnVzJyk7CiAKJHRyYW5zcG9ydE5hbWUgPSBhcnJheSgKICAgIFNVQldBWSAgPT4gICfQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCiAgICBGT09UICAgID0+ICAn0LjQtNC10YjRjCDQv9C10YjQutC+0LwnLAogICAgQlVTICAgICA9PiAgJ9C10LTQtdGI0Ywg0L3QsCDQsNCy0YLQvtCx0YPRgdC1JwopOwogCiRzdGFydFBvaW50ID0gJ3BldCc7IC8vINCf0LXRgtGA0L7Qs9GA0LDQtNGB0LrQsNGPCiRlbmRQb2ludCA9ICdub3YnOyAvLyDQndC+0LLQsNGPINCT0L7Qu9C70LDQvdC00LjRjwogCiRwb2ludE5hbWVzID0gYXJyYXkoCiAgICAncGV0JyAgID0+ICAn0YHRgi4g0LwuINCf0LXRgtGA0L7Qs9GA0LDQtNGB0LrQsNGPJywKICAgICdjaGsnICAgPT4gICfRgdGCLiDQvC4g0KfQutCw0LvQvtCy0YHQutCw0Y8nLAogICAgJ2dvcicgICA9PiAgJ9GB0YIuINC8LiDQk9C+0YDRjNC60L7QstGB0LrQsNGPJywKICAgICdzcG8nICAgPT4gICfRgdGCLiDQvC4g0KHQv9C+0YDRgtC40LLQvdCw0Y8nLAogICAgJ3ZhcycgICA9PiAgJ9GB0YIuINC8LiDQktCw0YHQuNC70LXQvtGB0YLRgNC+0LLRgdC60LDRjycsCiAgICAna3JlJyAgID0+ICAn0J/QtdGC0YDQvtC/0LDQstC70L7QstGB0LrQsNGPINC60YDQtdC/0L7RgdGC0YwnLAogICAgJ2xldCcgICA9PiAgJ9Cb0LXRgtC90LjQuSDRgdCw0LQnLAogICAgJ2R2bycgICA9PiAgJ9CU0LLQvtGA0YbQvtCy0LDRjyDQv9C70L7RidCw0LTRjCcsCiAgICAnaXNhJyAgID0+ICAn0JjRgdCw0LrQuNC10LLRgdC60LjQuSDRgdC+0LHQvtGAJywKICAgICdub3YnICAgPT4gICfQndC+0LLQsNGPINCT0L7Qu9C70LDQvdC00LjRjycsCiAgICAncmFzJyAgID0+ICAn0JTQvtC8INCg0LDRgdC60L7Qu9GM0L3QuNC60L7QstCwJywKICAgICdnb3MnICAgPT4gICfQk9C+0YHRgtC40L3Ri9C5INCU0LLQvtGAJywKICAgICdzZW4nICAgPT4gICfQodC10L3QvdCw0Y8g0J/Qu9C+0YnQsNC00YwnLAogICAgJ3ZsYScgICA9PiAgJ9GB0YIuINC8LiDQktC70LDQtNC40LzQuNGA0YHQutCw0Y8nLAogICAgJ3ZpdCcgICA9PiAgJ9CS0LjRgtC10LHRgdC60LjQuSDQstC+0LrQt9Cw0LsnLAogICAgJ3RlaCcgICA9PiAgJ9Ci0LXRhdC90L7Qu9C+0LPQuNGH0LXRgdC60LjQuSDQmNC90YHRgtC40YLRg9GCJwopOwogCiRwYXRocyA9IGFycmF5KAogICAgJ3BldCcgICA9PiAgYXJyYXkoCiAgICAgICAgJ2NoaycgICA9PiAgY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdnb3InICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAogCiAgICAnY2hrJyAgID0+ICBhcnJheSgKICAgICAgICAncGV0JyAgID0+ICBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgJ3NwbycgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICksCiAKICAgICdnb3InICAgPT4gIGFycmF5KAogICAgICAgICdwZXQnICAgPT4gIGNhbkdldCgzLCBCVVMpLAogICAgICAgICdrcmUnICAgPT4gIGNhbkdldCg1LCBGT09UKSwKICAgICAgICAnZ29zJyAgID0+ICBjYW5HZXQoNiwgU1VCV0FZKQogICAgKSwKIAogICAgJ3NwbycgICA9PiAgYXJyYXkoCiAgICAgICAgJ2NoaycgICA9PiAgY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgJ3ZhcycgICA9PiAgY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdzZW4nICAgPT4gIGNhbkdldCg3LCBTVUJXQVkpCiAgICApLAogCiAgICAndmFzJyAgID0+ICBhcnJheSgKICAgICAgICAnc3BvJyAgID0+ICBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgJ25vdicgICA9PiAgY2FuR2V0KDExLCBGT09UKQogICAgKSwKIAogICAgJ2tyZScgICA9PiAgYXJyYXkoCiAgICAgICAgJ2dvcicgICA9PiAgY2FuR2V0KDUsIEZPT1QpCiAgICApLAogCiAgICAnbGV0JyAgID0+ICBhcnJheSgKICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDcsIEZPT1QpCiAgICApLAogCiAgICAnZHZvJyAgID0+ICBhcnJheSgKICAgICAgICAnaXNhJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdsZXQnICAgPT4gIGNhbkdldCg2LCBGT09UKQogICAgKSwKIAogICAgJ2lzYScgICA9PiAgYXJyYXkoCiAgICAgICAgJ2R2bycgICA9PiAgY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdub3YnICAgPT4gIGNhbkdldCg1LCBGT09UKQogICAgKSwKIAogICAgJ25vdicgICA9PiAgYXJyYXkoCiAgICAgICAgJ3ZhcycgICA9PiAgY2FuR2V0KDExLCBGT09UKSwKICAgICAgICAnaXNhJyAgID0+ICBjYW5HZXQoNSwgRk9PVCksCiAgICAgICAgJ3JhcycgICA9PiAgY2FuR2V0KDcsIEJVUykKICAgICksCiAKICAgICdyYXMnICAgPT4gIGFycmF5KAogICAgICAgICdub3YnICAgPT4gIGNhbkdldCg3LCBCVVMpLAogICAgICAgICdzZW4nICAgPT4gIGNhbkdldCgzLCBGT09UKQogICAgKSwKIAogICAgJ2dvcycgICA9PiAgYXJyYXkoCiAgICAgICAgJ3ZhcycgICA9PiAgY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgJ3NlbicgICA9PiAgY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgJ2R2bycgICA9PiAgY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3InICAgPT4gIGNhbkdldCg2LCBTVUJXQVkpLAogICAgICAgICdsZXQnICAgPT4gIGNhbkdldCg3LCBGT09UKSwKICAgICAgICAndmxhJyAgID0+ICBjYW5HZXQoNywgRk9PVCkgICAgICAgIAogICAgKSwKIAogICAgJ3NlbicgICA9PiAgYXJyYXkoCiAgICAgICAgJ3JhcycgICA9PiAgY2FuR2V0KDMsIEZPT1QpLAogICAgICAgICdzcG8nICAgPT4gIGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdnb3MnICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICd2bGEnICAgPT4gIGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICd2aXQnICAgPT4gIGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICd0ZWgnICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAogCiAgICAndmxhJyAgID0+ICBhcnJheSgKICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoNCwgU1VCV0FZKSwKICAgICAgICAnZ29zJyAgID0+ICBjYW5HZXQoNywgRk9PVCksCiAgICAgICAgJ3ZpdCcgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICksCiAKICAgICd2aXQnICAgPT4gIGFycmF5KAogICAgICAgICdzZW4nICAgPT4gIGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICd0ZWgnICAgPT4gIGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICd2bGEnICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAogCiAgICAndGVoJyAgID0+ICBhcnJheSgKICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAndml0JyAgID0+ICBjYW5HZXQoMiwgU1VCV0FZKSAgICAgICAgCiAgICApCik7Cgokc3RhcnQgPSAibm92IjsKJHRhcmdldCA9ICJrcmUiOwokcGF0aERvbmUgPSBbJHN0YXJ0XTsKJHRpbWUgPSAwOwoKJGJlc3RQYXRoID0gZmluZEJlc3RQYXRoKCRwYXRocywgJHBhdGhEb25lLCAkdGltZSwgJHN0YXJ0LCAkdGFyZ2V0KTsKCmVjaG8gItCd0LDRh9Cw0LvRjNC90LDRjyDRgtC+0YfQutCwOiAkcG9pbnROYW1lc1skc3RhcnRdPGJyPiI7CmZvcigkaSA9IDE7ICRpIDwgY291bnQoJGJlc3RQYXRoWydwYXRoJ10pOyAkaSsrKXsKICAgICRjdXIgPSAkYmVzdFBhdGhbJ3BhdGgnXVskaSAtIDFdOwogICAgJGN1ckZ1bGwgPSAkcG9pbnROYW1lc1skYmVzdFBhdGhbJ3BhdGgnXVskaSAtIDFdXTsKICAgICRuZXh0ID0gJGJlc3RQYXRoWydwYXRoJ11bJGldOwogICAgJG5leHRGdWxsID0gJHBvaW50TmFtZXNbJGJlc3RQYXRoWydwYXRoJ11bJGldXTsKICAgICR0ciA9ICR0cmFuc3BvcnROYW1lWyRwYXRoc1skY3VyXVskbmV4dF1bJ2J5J11dOwogICAgJHRpID0gJHBhdGhzWyRjdXJdWyRuZXh0XVsndGltZSddOwogICAgZWNobyAi0JjQtyDQvdC10ZEgJHRyINC00L4g0YLQvtGH0LrQuCAkbmV4dEZ1bGwgJHRpINC80LjQvS48YnI+IjsKICAgIGlmKCRpID09IGNvdW50KCRiZXN0UGF0aFsncGF0aCddKSAtIDEpewogICAgICAgICR0aW1lID0gJGJlc3RQYXRoWyd0aW1lJ107CiAgICAgICAgZWNobyAi0JIg0LjRgtC+0LPQtSDRgtGLINC/0L7Qv9Cw0LTRkdGI0Ywg0LIg0YLQvtGH0LrRgyAkbmV4dEZ1bGwg0LfQsCAkdGltZSDQvNC40L0uINCf0YDQuNGP0YLQvdC+0Lkg0L/QvtC10LfQtNC60LghIjsKICAgIH0KfQoKCgpmdW5jdGlvbiBmaW5kQmVzdFBhdGgoJHBhdGhzLCAkcGF0aERvbmUsICR0aW1lLCAkc3RhcnQsICR0YXJnZXQpeyAgICAKICAgICRiZXN0UGF0aCA9IFsKICAgICAgICAncGF0aCcgPT4gW10sCiAgICAgICAgJ3RpbWUnID0+IDk5OTk5OQogICAgXTsKICAgICRyZXN1bHQgPSBbXTsKCiAgICAkZm91bmRQYXRocyA9IGZpbmRQYXRocygkcGF0aHMsICRwYXRoRG9uZSwgJHRpbWUsICRzdGFydCwgJHRhcmdldCk7CgogICAgZm9yKCRpID0gMDsgJGkgPCBjb3VudCgkZm91bmRQYXRocyk7ICRpICs9IDIpewogICAgICAgICR0ZW1wQXJyYXkgPSBbXTsKICAgICAgICAkdGVtcEFycmF5WydwYXRoJ10gPSAkZm91bmRQYXRoc1skaV07CiAgICAgICAgJHRlbXBBcnJheVsndGltZSddID0gJGZvdW5kUGF0aHNbJGkgKyAxXTsKICAgICAgICBhcnJheV9wdXNoKCRyZXN1bHQsICR0ZW1wQXJyYXkpOwogICAgfQogICAgCiAgICBmb3JlYWNoKCRyZXN1bHQgYXMgJHBhdGgpewogICAgICAgIGlmKCRwYXRoWyJ0aW1lIl0gPCAkYmVzdFBhdGhbInRpbWUiXSl7CiAgICAgICAgICAgICRiZXN0UGF0aCA9ICRwYXRoOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJGJlc3RQYXRoOwp9CgpmdW5jdGlvbiBmaW5kUGF0aHMoJHBhdGhzLCAkcGF0aERvbmUsICR0aW1lLCAkcG9pbnQsICR0YXJnZXQpewoJJHJlc3VsdCA9IFtdOwogICAgJGZvdW5kUGF0aHMgPSBbXTsKCglpZihhcnJheV9rZXlfZXhpc3RzKCR0YXJnZXQsICRwYXRoc1skcG9pbnRdKSl7CgkJYXJyYXlfcHVzaCgkcGF0aERvbmUsICR0YXJnZXQpOwoJCSRyZXN1bHRbJ3BhdGgnXSA9ICRwYXRoRG9uZTsKCQkkcmVzdWx0Wyd0aW1lJ10gPSAkdGltZSArICRwYXRoc1skcG9pbnRdWyR0YXJnZXRdWyd0aW1lJ107CgkJcmV0dXJuICRyZXN1bHQ7Cgl9ZWxzZXsKCQlmb3JlYWNoKCRwYXRoc1skcG9pbnRdIGFzICRjb25uZWN0ZWRQb2ludCA9PiAkY29ubmVjdGVkUG9pbnREYXRhKXsKICAgICAgICAgICAgaWYoaW5fYXJyYXkoJGNvbm5lY3RlZFBvaW50LCAkcGF0aERvbmUpKXsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICRuZXdQYXRoRG9uZSA9ICRwYXRoRG9uZTsKICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJG5ld1BhdGhEb25lLCAkY29ubmVjdGVkUG9pbnQpOwoKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBmaW5kUGF0aHMoJHBhdGhzLCAkbmV3UGF0aERvbmUsICR0aW1lKyRjb25uZWN0ZWRQb2ludERhdGFbJ3RpbWUnXSwgJGNvbm5lY3RlZFBvaW50LCAkdGFyZ2V0KTsKCiAgICAgICAgICAgICAgICBpZighZW1wdHkoJHJlc3VsdCkpewogICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRyZXN1bHQpID09IDEpewogICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRmb3VuZFBhdGhzLCAkcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZWlmKGNvdW50KCRyZXN1bHQpID4gMSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJHJlc3VsdCBhcyAgJHBhdGgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkZm91bmRQYXRocywgJHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJGZvdW5kUGF0aHMsICRyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KCX0KCiAgICByZXR1cm4gJGZvdW5kUGF0aHM7Cn0KCmZ1bmN0aW9uIGNhbkdldCgkdGltZSwgJGJ5V2hhdCkgewogICAgcmV0dXJuIGFycmF5KCd0aW1lJyAgICAgPT4gICR0aW1lLCAnYnknID0+ICAkYnlXaGF0KTsKfQ==