Извините, я не смог устоять
Я видел эту же головоломку (вопрос) на Yahoo!Отвечает , и я ответил на него.
Реализация началась как проект, основанный на создании дерева для обхода графа;но в итоге он соответствовал дизайну, выраженному ранее Алексом Брауном .
Первоначально планирование было выполнено в Haskell , следовательно, эта вспомогательная функция:
fun replicate len el =
if len = 0 then nil else el::replicate (len -1) el
Основная реализация:
fun routes dst (edges:(int * int) list) src =
let val (very_possible,remotely_possible) =
if null edges
then (nil,nil)
else List.partition ((fn s=> s = src) o #1) edges
val (raw_solutions,dsts_is_nx_srcs) =
List.partition ((fn d => d = dst) o #2) very_possible
val solutions = replicate (length raw_solutions) [src,dst]
val full_rest_routes =
let val rest_rest_routes =
map (routes dst remotely_possible)
( map #2 dsts_is_nx_srcs )
in map (fn lst => src::lst) (List.concat rest_rest_routes)
end
in case (very_possible, solutions, remotely_possible)
of (nil, _, _) => nil
| (_::_, (p::ps), _) => solutions @ full_rest_routes
| (_::_, nil, _::_) => full_rest_routes
| (_ , nil, nil ) => nil
end
Пользовательский интерфейс:
fun getPaths edges src dst = routes dst edges src
Код выше взят из rout4.sml ;но тестирование и ввод-вывод опущены.Даже если это не слишком долго, я все еще надеюсь, что это будет проще.