fork(1) download
  1. <?php
  2.  
  3.  
  4. define('SUBWAY', 'sub');
  5. define('FOOT', 'foot');
  6. define('BUS', 'bus');
  7.  
  8. $transportName = array(
  9. SUBWAY => 'едешь на метро',
  10. FOOT => 'идешь пешком',
  11. BUS => 'едешь на автобусе'
  12. );
  13.  
  14. $startPoint = 'pet'; // Петроградская
  15. $endPoint = 'nov'; // Новая Голландия
  16.  
  17. $pointNames = array(
  18. 'pet' => 'ст. м. Петроградская',
  19. 'chk' => 'ст. м. Чкаловская',
  20. 'gor' => 'ст. м. Горьковская',
  21. 'spo' => 'ст. м. Спортивная',
  22. 'vas' => 'ст. м. Василеостровская',
  23. 'kre' => 'Петропавловская крепость',
  24. 'let' => 'Летний сад',
  25. 'dvo' => 'Дворцовая площадь',
  26. 'isa' => 'Исакиевский собор',
  27. 'nov' => 'Новая Голландия',
  28. 'ras' => 'Дом Раскольникова',
  29. 'gos' => 'Гостиный Двор',
  30. 'sen' => 'Сенная Площадь',
  31. 'vla' => 'ст. м. Владимирская',
  32. 'vit' => 'Витебский вокзал',
  33. 'teh' => 'Технологический Институт'
  34. );
  35.  
  36. $paths = array(
  37. 'pet' => array(
  38. 'chk' => canGet(10, BUS),
  39. 'gor' => canGet(3, SUBWAY)
  40. ),
  41.  
  42. 'chk' => array(
  43. 'pet' => canGet(10, BUS),
  44. 'spo' => canGet(3, SUBWAY)
  45. ),
  46.  
  47. 'gor' => array(
  48. 'pet' => canGet(3, BUS),
  49. 'kre' => canGet(5, FOOT),
  50. 'gos' => canGet(6, SUBWAY)
  51. ),
  52.  
  53. 'spo' => array(
  54. 'chk' => canGet(3, SUBWAY),
  55. 'vas' => canGet(10, BUS),
  56. 'sen' => canGet(7, SUBWAY)
  57. ),
  58.  
  59. 'vas' => array(
  60. 'spo' => canGet(10, BUS),
  61. 'gos' => canGet(7, SUBWAY),
  62. 'nov' => canGet(11, FOOT)
  63. ),
  64.  
  65. 'kre' => array(
  66. 'gor' => canGet(5, FOOT)
  67. ),
  68.  
  69. 'let' => array(
  70. 'dvo' => canGet(6, FOOT),
  71. 'gos' => canGet(7, FOOT)
  72. ),
  73.  
  74. 'dvo' => array(
  75. 'isa' => canGet(6, FOOT),
  76. 'gos' => canGet(6, FOOT),
  77. 'let' => canGet(6, FOOT)
  78. ),
  79.  
  80. 'isa' => array(
  81. 'dvo' => canGet(6, FOOT),
  82. 'nov' => canGet(5, FOOT)
  83. ),
  84.  
  85. 'nov' => array(
  86. 'vas' => canGet(11, FOOT),
  87. 'isa' => canGet(5, FOOT),
  88. 'ras' => canGet(7, BUS)
  89. ),
  90.  
  91. 'ras' => array(
  92. 'nov' => canGet(7, BUS),
  93. 'sen' => canGet(3, FOOT)
  94. ),
  95.  
  96. 'gos' => array(
  97. 'vas' => canGet(7, SUBWAY),
  98. 'sen' => canGet(3, SUBWAY),
  99. 'dvo' => canGet(6, FOOT),
  100. 'gor' => canGet(6, SUBWAY),
  101. 'let' => canGet(7, FOOT),
  102. 'vla' => canGet(7, FOOT)
  103. ),
  104.  
  105. 'sen' => array(
  106. 'ras' => canGet(3, FOOT),
  107. 'spo' => canGet(7, SUBWAY),
  108. 'gos' => canGet(3, SUBWAY),
  109. 'vla' => canGet(4, SUBWAY),
  110. 'vit' => canGet(2, SUBWAY),
  111. 'teh' => canGet(3, SUBWAY)
  112. ),
  113.  
  114. 'vla' => array(
  115. 'sen' => canGet(4, SUBWAY),
  116. 'gos' => canGet(7, FOOT),
  117. 'vit' => canGet(3, SUBWAY)
  118. ),
  119.  
  120. 'vit' => array(
  121. 'sen' => canGet(2, SUBWAY),
  122. 'teh' => canGet(2, SUBWAY),
  123. 'vla' => canGet(3, SUBWAY)
  124. ),
  125.  
  126. 'teh' => array(
  127. 'sen' => canGet(3, SUBWAY),
  128. 'vit' => canGet(2, SUBWAY)
  129. )
  130. );
  131.  
  132. $start = "nov";
  133. $target = "kre";
  134. $pathDone = [$start];
  135. $time = 0;
  136.  
  137. $bestPath = findBestPath($paths, $pathDone, $time, $start, $target);
  138.  
  139. echo "Начальная точка: $pointNames[$start]<br>";
  140. for($i = 1; $i < count($bestPath['path']); $i++){
  141. $cur = $bestPath['path'][$i - 1];
  142. $curFull = $pointNames[$bestPath['path'][$i - 1]];
  143. $next = $bestPath['path'][$i];
  144. $nextFull = $pointNames[$bestPath['path'][$i]];
  145. $tr = $transportName[$paths[$cur][$next]['by']];
  146. $ti = $paths[$cur][$next]['time'];
  147. echo "Из неё $tr до точки $nextFull $ti мин.<br>";
  148. if($i == count($bestPath['path']) - 1){
  149. $time = $bestPath['time'];
  150. echo "В итоге ты попадёшь в точку $nextFull за $time мин. Приятной поездки!";
  151. }
  152. }
  153.  
  154.  
  155.  
  156. function findBestPath($paths, $pathDone, $time, $start, $target){
  157. $bestPath = [
  158. 'path' => [],
  159. 'time' => 999999
  160. ];
  161. $result = [];
  162.  
  163. $foundPaths = findPaths($paths, $pathDone, $time, $start, $target);
  164.  
  165. for($i = 0; $i < count($foundPaths); $i += 2){
  166. $tempArray = [];
  167. $tempArray['path'] = $foundPaths[$i];
  168. $tempArray['time'] = $foundPaths[$i + 1];
  169. array_push($result, $tempArray);
  170. }
  171.  
  172. foreach($result as $path){
  173. if($path["time"] < $bestPath["time"]){
  174. $bestPath = $path;
  175. }
  176. }
  177.  
  178. return $bestPath;
  179. }
  180.  
  181. function findPaths($paths, $pathDone, $time, $point, $target){
  182. $result = [];
  183. $foundPaths = [];
  184.  
  185. if(array_key_exists($target, $paths[$point])){
  186. array_push($pathDone, $target);
  187. $result['path'] = $pathDone;
  188. $result['time'] = $time + $paths[$point][$target]['time'];
  189. return $result;
  190. }else{
  191. foreach($paths[$point] as $connectedPoint => $connectedPointData){
  192. if(in_array($connectedPoint, $pathDone)){
  193. continue;
  194. }else{
  195. $newPathDone = $pathDone;
  196. array_push($newPathDone, $connectedPoint);
  197.  
  198. $result = findPaths($paths, $newPathDone, $time+$connectedPointData['time'], $connectedPoint, $target);
  199.  
  200. if(!empty($result)){
  201. if(count($result) == 1){
  202. array_push($foundPaths, $result);
  203. }elseif(count($result) > 1){
  204. foreach($result as $path){
  205. array_push($foundPaths, $path);
  206. }
  207. }else{
  208. array_push($foundPaths, $result);
  209. }
  210. }
  211. }
  212. }
  213. }
  214.  
  215. return $foundPaths;
  216. }
  217.  
  218. function canGet($time, $byWhat) {
  219. return array('time' => $time, 'by' => $byWhat);
  220. }
Success #stdin #stdout 0.02s 26332KB
stdin
Standard input is empty
stdout
Начальная точка: Новая Голландия<br>Из неё едешь на автобусе до точки Дом Раскольникова 7 мин.<br>Из неё идешь пешком до точки Сенная Площадь 3 мин.<br>Из неё едешь на метро до точки Гостиный Двор 3 мин.<br>Из неё едешь на метро до точки ст. м. Горьковская 6 мин.<br>Из неё идешь пешком до точки Петропавловская крепость 5 мин.<br>В итоге ты попадёшь в точку Петропавловская крепость за 24 мин. Приятной поездки!