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



Начальная точка: "ст. м. Петроградская"
Из нее идешь пешком до точки "Гостиный Двор" 6 мин.
Из нее идешь пешком до точки "Сенная Площадь" 6 мин.
Из нее идешь пешком до точки "ст. м. Владимирская" 6 мин.
В итоге ты попадешь в точку "Новая Голландия" за 13 мин. Приятной поездки!