fork download
  1. <?php
  2. header("Content-Type: text/plain; charset=utf-8");
  3. ?>
  4.  
  5. <?php
  6. /* http://d...content-available-to-author-only...2.net/ */
  7. define('SUBWAY', 'sub');
  8. define('FOOT', 'foot');
  9. define('BUS', 'bus');
  10. $transportName = array(
  11. SUBWAY => 'едешь на метро',
  12. FOOT => 'идешь пешком',
  13. BUS => 'едешь на автобусе'
  14. );
  15. $startPoint = 'pet'; // Петроградская
  16. $endPoint = 'nov'; // Новая Голландия
  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. $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. );
  130. /* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.
  131. «canGet» переводится как «можно попасть» */
  132. function canGet($time, $byWhat)
  133. {
  134. return array(
  135. 'time' => $time,
  136. 'by' => $byWhat
  137. );
  138. }
  139. $pathDone = array();
  140. $time = 0;
  141. $lowerTime = 5000;
  142. function makeOneStep($paths, $startPoint, $endPoint, $time = 0, $lowerTime = 5000, $pathDone)
  143. {
  144.  
  145. $pathDone[] = $startPoint;
  146.  
  147. $result = array();
  148. if (isset($paths[$startPoint][$endPoint])) {
  149. $pathDone[] = $endPoint;
  150. $time += $paths[$startPoint][$endPoint]['time'];
  151. $result['path'] = $pathDone;
  152. $result['time'] = $time;
  153. return $result;
  154. }
  155.  
  156. $shortest = array();
  157.  
  158. foreach ($paths[$startPoint] as $stationName => $stationInfo) {
  159. if (!in_array($stationName, $pathDone)) {
  160. $xTime = $time;
  161. $pointTime = $paths[$startPoint][$stationName]['time'];
  162. $xTime += $pointTime;
  163. $newPath = makeOneStep($paths, $stationName, $endPoint, $xTime, $lowerTime, $pathDone);
  164. if (!isset($newPath['time'])) {
  165.  
  166. CONTINUE;
  167. }
  168.  
  169. if (($newPath['time'] < $lowerTime)) {
  170.  
  171. $lowerTime = $newPath['time'];
  172. $shortest = $newPath;
  173. }
  174.  
  175.  
  176. }
  177. }
  178. $result = $shortest;
  179.  
  180. return $result;
  181.  
  182.  
  183. }
  184. $path = makeOneStep($paths, $startPoint, $endPoint, $time, $lowerTime, $pathDone);
  185. $text = "Маршрут построен: \nНачальная точка ";
  186. $i = 0;
  187. for ($i = 0; $i < count($path['path']); $i++) {
  188. $point = $path['path'][$i];
  189. if ($i == 0) {
  190. $text .= "«{$pointNames[$point]}»\n";
  191. }
  192.  
  193. else {
  194. $byWhat = $paths[$lastPoint][$point]['by'];
  195. $text .= "Из неё {$transportName[$byWhat]} «{$pointNames[$point]}» за {$paths[$lastPoint][$point]['time']} мин\n";
  196. }
  197. $lastPoint = $point;
  198. }
  199. $text .= "В итоге ты попадешь в «{$pointNames[$point]}» за {$path['time']} мин\n";
  200. echo $text;
Success #stdin #stdout 0.02s 24448KB
stdin
Standard input is empty
stdout
 
Маршрут построен: 
Начальная точка «ст. м. Петроградская»
Из неё едешь на метро  «ст. м. Горьковская»  за 3 мин
Из неё едешь на метро  «Гостиный Двор»  за 6 мин
Из неё едешь на метро  «Сенная Площадь»  за 3 мин
Из неё идешь пешком  «Дом Раскольникова»  за 3 мин
Из неё едешь на автобусе  «Новая Голландия»  за 7 мин
В итоге ты попадешь в  «Новая Голландия» за 22 мин