fork download
  1. <?php
  2.  
  3. /*
  4. Программа: поиск пути
  5. Версия:5.0
  6. На данном этапе программа:
  7. -ищет самый короткий путь из точки A в B
  8. -показывает время достижения пути
  9. -показывает способ достижения пути
  10. -показывает, на чём добираться
  11. -сколько времени это займёт
  12.  
  13.  
  14. Todo:
  15. -возможно, сделать для метро
  16. -изменить структуру кода (что-бы путь Медведково=>Проспект Мира не показывал все промежуточные станции)
  17. -долго вбивать все станции (взять в Яндексе или найти где-нибудь еще)
  18. -можно сделать 2-3 ветки и не париться
  19.  
  20. -сделать web-интерфейс с приложенной картой (http://content-available-to-author-only.cc/55nguY) и формой
  21. -немного современного дизайна
  22.  
  23. */
  24.  
  25. define('SUBWAY', 'sub');
  26. define('FOOT', 'foot');
  27. define('BUS', 'bus');
  28.  
  29. $transportName = array(
  30. SUBWAY => 'на метро',
  31. FOOT => 'пешком',
  32. BUS => 'на автобусе'
  33. );
  34.  
  35. $pointNames = array(
  36. 'pet' => 'ст. м. Петроградская',
  37. 'chk' => 'ст. м. Чкаловская',
  38. 'gor' => 'ст. м. Горьковская',
  39. 'spo' => 'ст. м. Спортивная',
  40. 'vas' => 'ст. м. Василеостровская',
  41. 'kre' => 'Петропавловская крепость',
  42. 'let' => 'Летний сад',
  43. 'dvo' => 'Дворцовая площадь',
  44. 'isa' => 'Исакиевский собор',
  45. 'nov' => 'Новая Голландия',
  46. 'ras' => 'Дом Раскольникова',
  47. 'gos' => 'Гостиный Двор',
  48. 'sen' => 'Сенная Площадь',
  49. 'vla' => 'ст. м. Владимирская',
  50. 'vit' => 'Витебский вокзал',
  51. 'teh' => 'Технологический Институт'
  52. );
  53.  
  54. $paths = array(
  55. 'pet' => array(
  56. 'chk' => canGet(10, BUS),
  57. 'gor' => canGet(3, SUBWAY)
  58. ),
  59.  
  60. 'chk' => array(
  61. 'pet' => canGet(10, BUS),
  62. 'spo' => canGet(3, SUBWAY)
  63. ),
  64.  
  65. 'gor' => array(
  66. 'pet' => canGet(3, BUS),
  67. 'kre' => canGet(5, FOOT),
  68. 'gos' => canGet(6, SUBWAY)
  69. ),
  70.  
  71. 'spo' => array(
  72. 'chk' => canGet(3, SUBWAY),
  73. 'vas' => canGet(10, BUS),
  74. 'sen' => canGet(7, SUBWAY)
  75. ),
  76.  
  77. 'vas' => array(
  78. 'spo' => canGet(10, BUS),
  79. 'gos' => canGet(7, SUBWAY),
  80. 'nov' => canGet(11, FOOT)
  81. ),
  82.  
  83. 'kre' => array(
  84. 'gor' => canGet(5, FOOT)
  85. ),
  86.  
  87. 'let' => array(
  88. 'dvo' => canGet(6, FOOT),
  89. 'gos' => canGet(7, FOOT)
  90. ),
  91.  
  92. 'dvo' => array(
  93. 'isa' => canGet(6, FOOT),
  94. 'gos' => canGet(6, FOOT),
  95. 'let' => canGet(6, FOOT)
  96. ),
  97.  
  98. 'isa' => array(
  99. 'dvo' => canGet(6, FOOT),
  100. 'nov' => canGet(5, FOOT)
  101. ),
  102.  
  103. 'nov' => array(
  104. 'vas' => canGet(11, FOOT),
  105. 'isa' => canGet(5, FOOT),
  106. 'ras' => canGet(7, BUS)
  107. ),
  108.  
  109. 'ras' => array(
  110. 'nov' => canGet(7, BUS),
  111. 'sen' => canGet(3, FOOT)
  112. ),
  113.  
  114. 'gos' => array(
  115. 'vas' => canGet(7, SUBWAY),
  116. 'sen' => canGet(3, SUBWAY),
  117. 'dvo' => canGet(6, FOOT),
  118. 'gor' => canGet(6, SUBWAY),
  119. 'let' => canGet(7, FOOT),
  120. 'vla' => canGet(7, FOOT)
  121. ),
  122.  
  123. 'sen' => array(
  124. 'ras' => canGet(3, FOOT),
  125. 'spo' => canGet(7, SUBWAY),
  126. 'gos' => canGet(3, SUBWAY),
  127. 'vla' => canGet(4, SUBWAY),
  128. 'vit' => canGet(2, SUBWAY),
  129. 'teh' => canGet(3, SUBWAY)
  130. ),
  131.  
  132. 'vla' => array(
  133. 'sen' => canGet(4, SUBWAY),
  134. 'gos' => canGet(7, FOOT),
  135. 'vit' => canGet(3, SUBWAY)
  136. ),
  137.  
  138. 'vit' => array(
  139. 'sen' => canGet(2, SUBWAY),
  140. 'teh' => canGet(2, SUBWAY),
  141. 'vla' => canGet(3, SUBWAY)
  142. ),
  143.  
  144. 'teh' => array(
  145. 'sen' => canGet(3, SUBWAY),
  146. 'vit' => canGet(2, SUBWAY)
  147. )
  148. );
  149.  
  150. /* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.
  151.   «canGet» переводится как «можно попасть» */
  152. function canGet($time, $byWhat) {
  153. return array('time' => $time, 'by' => $byWhat);
  154. }
  155.  
  156. function find_way($paths,$from,$where,$time,$way){
  157.  
  158. if (!is_array($way)){
  159. $way=array();
  160. $way[]=$from;
  161. }
  162.  
  163. $current=$way[count($way)-1]; //на какой мы сейчас станции
  164.  
  165. //Считаем время
  166. if (count($way)>1){
  167. $prev=$way[count($way)-2]; //Предыдущая станция(для времени)
  168. $time+=$paths[$prev][$current]['time'];
  169. }
  170.  
  171.  
  172. if(array_key_exists($where,$paths[$current])){
  173. $way[]=$where;
  174. $time+=$paths[$current][$where]['time']; //Время текущей с следующей (,которая цель)
  175.  
  176. $arrPrep['way']=$way;
  177. $arrPrep['time']=$time;
  178. $GLOBALS['ways'][]=$arrPrep;//Добавляем вариант прохода в возвращаемый функцией массив
  179. }
  180. else{
  181. foreach ($paths[$current] as $k=>$v){
  182. $next=$k;
  183. if(!in_array($next,$way)){
  184. $way[]=$next;
  185. find_way($paths,$from,$where,$time,$way);
  186. array_pop($way);
  187. }
  188.  
  189. }
  190. }
  191. if (isset($GLOBALS['ways']))
  192. return ($GLOBALS['ways']);
  193. }
  194.  
  195. ////////////////////////////////////
  196. function find_shortest_way($paths,$from,$where,$time,$way){
  197. $ways=find_way($paths,$from,$where,$time,$way);
  198.  
  199. $shortest['time']=0;
  200. $shortest['way']='';
  201.  
  202. foreach($ways as $k=>$v){
  203. if (($shortest['time']>$ways[$k]['time'])||($shortest['time']==0)){
  204. $shortest['time']=$ways[$k]['time'];
  205. $shortest['way']=$ways[$k]['way'];
  206. }
  207. }
  208.  
  209. return $shortest;
  210. }
  211. ////////////////////////////////////
  212. function show_shortest_way($paths,$from,$where,$time,$way,$pointNames,$transportName){
  213. $ways=find_shortest_way($paths,$from,$where,$time,$way);
  214.  
  215. $first=$pointNames[reset($ways['way'])];
  216. $last=$pointNames[end($ways['way'])];
  217.  
  218. echo "Как доехать из ".$first." в ".$last." за ".$ways['time']." минут\n";
  219.  
  220. for($i=0;$i<count($ways['way']);$i++){
  221. $current=$ways['way'][$i];
  222.  
  223.  
  224. if ($i<(count($ways['way'])-1)){
  225. $next=$ways['way'][$i+1];
  226. echo "".$pointNames[$current]."\n =>";
  227. echo $transportName[$paths[$current][$next]['by']]. "";
  228. echo " за ".$paths[$current][$next]['time']." минут\n";
  229. }
  230. else
  231. echo $pointNames[$current]."\n\n";
  232. }
  233. }
  234. ////////////////////////////////////
  235. show_shortest_way($paths,'pet','teh',0,null,$pointNames,$transportName);
  236. show_shortest_way($paths,'vas','let',0,null,$pointNames,$transportName);
Success #stdin #stdout 0.03s 52480KB
stdin
Standard input is empty
stdout
Как доехать из ст. м. Петроградская в Технологический Институт за 15 минут
ст. м. Петроградская
	=>на метро за 3 минут
ст. м. Горьковская
	=>на метро за 6 минут
Гостиный Двор
	=>на метро за 3 минут
Сенная Площадь
	=>на метро за 3 минут
Технологический Институт

Как доехать из ст. м. Василеостровская в Летний сад за 14 минут
ст. м. Василеостровская
	=>на метро за 7 минут
Гостиный Двор
	=>пешком за 7 минут
Летний сад