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