fork(1) 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. 'chk' => array(
  41. 'pet' => canGet(10, BUS),
  42. 'spo' => canGet(3, SUBWAY)
  43. ),
  44. 'gor' => array(
  45. 'pet' => canGet(3, BUS),
  46. 'kre' => canGet(5, FOOT),
  47. 'gos' => canGet(6, SUBWAY)
  48. ),
  49. 'spo' => array(
  50. 'chk' => canGet(3, SUBWAY),
  51. 'vas' => canGet(10, BUS),
  52. 'sen' => canGet(7, SUBWAY)
  53. ),
  54. 'vas' => array(
  55. 'spo' => canGet(10, BUS),
  56. 'gos' => canGet(7, SUBWAY),
  57. 'nov' => canGet(11, FOOT)
  58. ),
  59. 'kre' => array(
  60. 'gor' => canGet(5, FOOT)
  61. ),
  62. 'let' => array(
  63. 'dvo' => canGet(6, FOOT),
  64. 'gos' => canGet(7, FOOT)
  65. ),
  66. 'dvo' => array(
  67. 'isa' => canGet(6, FOOT),
  68. 'gos' => canGet(6, FOOT),
  69. 'let' => canGet(6, FOOT)
  70. ),
  71. 'isa' => array(
  72. 'dvo' => canGet(6, FOOT),
  73. 'nov' => canGet(5, FOOT)
  74. ),
  75. 'nov' => array(
  76. 'vas' => canGet(11, FOOT),
  77. 'isa' => canGet(5, FOOT),
  78. 'ras' => canGet(7, BUS)
  79. ),
  80. 'ras' => array(
  81. 'nov' => canGet(7, BUS),
  82. 'sen' => canGet(3, FOOT)
  83. ),
  84. 'gos' => array(
  85. 'vas' => canGet(7, SUBWAY),
  86. 'sen' => canGet(3, SUBWAY),
  87. 'dvo' => canGet(6, FOOT),
  88. 'gor' => canGet(6, SUBWAY),
  89. 'let' => canGet(7, FOOT),
  90. 'vla' => canGet(7, FOOT)
  91. ),
  92. 'sen' => array(
  93. 'ras' => canGet(3, FOOT),
  94. 'spo' => canGet(7, SUBWAY),
  95. 'gos' => canGet(3, SUBWAY),
  96. 'vla' => canGet(4, SUBWAY),
  97. 'vit' => canGet(2, SUBWAY),
  98. 'teh' => canGet(3, SUBWAY)
  99. ),
  100. 'vla' => array(
  101. 'sen' => canGet(4, SUBWAY),
  102. 'gos' => canGet(7, FOOT),
  103. 'vit' => canGet(3, SUBWAY)
  104. ),
  105. 'vit' => array(
  106. 'sen' => canGet(2, SUBWAY),
  107. 'teh' => canGet(2, SUBWAY),
  108. 'vla' => canGet(3, SUBWAY)
  109. ),
  110. 'teh' => array(
  111. 'sen' => canGet(3, SUBWAY),
  112. 'vit' => canGet(2, SUBWAY)
  113. )
  114. );
  115.  
  116. // Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.
  117.  
  118. function canGet($time, $byWhat) {
  119. return array('time' => $time, 'by' => $byWhat);
  120. }
  121.  
  122. function makeOneStep($paths, $pathDone, $time, $point, $target) {
  123. $result = ['time', 'path'];
  124. foreach ($paths[$point] as $path => $value) {
  125. if ($path == $target) {
  126. array_push($pathDone, $path);
  127. $result['path'] = $pathDone;
  128. $result['time'] = $time + $value['time'];
  129. return $result;
  130. }
  131. }
  132. foreach ($paths[$point] as $path => $value) {
  133. if (in_array($path, $pathDone)) {
  134. continue;
  135. }
  136. array_push($pathDone, $path);
  137. $time += $value['time'];
  138. $point = $path;
  139. return makeOneStep($paths, $pathDone, $time, $point, $target);
  140. }
  141. }
  142.  
  143. $pathDone = array('pet');
  144. $time = 0;
  145. $point = 'pet';
  146. $target = 'nov';
  147.  
  148. $result = makeOneStep($paths, $pathDone, $time, $point, $target);
  149.  
  150. print_r($result['path']);
  151.  
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
Array
(
    [0] => pet
    [1] => chk
    [2] => spo
    [3] => vas
    [4] => nov
)