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