Предмет: Информатика, автор: jsnsjd28

Между населёнными пунктами A, B, C, D, E, F построены дороги, протяжённость которых ( в километрах ) приведена в таблице.
Определите длину кратчайшего пути между пунктами A и F. Передвигаться можно только по дорогам, указанным в таблице.

Приложения:

Ответы

Автор ответа: MaxLevs
1

Решим эмпирически. В качестве языка использую Haskell.

Таблица описывается функцией ways.

  • type Way = ([Char], Int)
  • ways :: [(Char, [(Char, Maybe Int)])]
  • ways =  f $ fltr . f <$>
  •                [[Nothing, Just 3, Just 4, Nothing, Nothing, Just 18],
  •                [Just 3, Nothing, Just 3, Nothing, Nothing, Nothing],
  •                [Just 4, Just 3, Nothing, Just 4, Nothing, Nothing],
  •                [Nothing, Nothing, Just 4, Nothing, Just 2, Just 6],
  •                [Nothing, Nothing, Nothing, Just 2, Nothing, Just 1],
  •                [Just 18, Nothing, Nothing, Just 6, Just 1, Nothing]]
  •  where
  •    f = zip "ABCDEF"
  •    fltr = filter $ isJust . snd
  • fromA :: Char -> [(Char, Maybe Int)]
  • fromA a = join [x | (c, x) <- ways, c == a]
  • findWays :: Char -> Char -> [Way]
  • findWays a b = findWays' a b ("", 0)
  • findWays' :: Char -> Char -> Way -> [Way]
  • findWays' a b (w, c)
  •  | a == b = [(w ++ [a], c)]
  •  | otherwise = [(w', c'') | (a', Just c') <- fromA a, a' `notElem` w, (w', c'') <- findWays' a' b (w ++ [a], c + c')]
  • findMin :: Ord a => [(a, b)] -> (a, b)
  • findMin xs  | length xs == 1 = head xs
  •            | fst x < fst y = findMin $ x : drop 2 xs
  •            | otherwise  = findMin $ y : drop 2 xs
  •            where
  •              x = head xs
  •              y = xs !! 1
  • main :: Char -> Char -> (String, Int)
  • main a b = findMin $ findWays a b

Вызов main 'A' 'F' выдаст длину кратчайшего пути.

Ответ: Кратчайший путь A-C-D-E-F. Его длина – 11.

Приложения:
Похожие вопросы
Предмет: Русский язык, автор: klimova2005
Предмет: Русский язык, автор: МишкаНаСевере
Выписать всеСПП

Чтобы оценить доброту и понять ее значение, надо непременно самому испытать ее: надо воспринять луч чужой доброты и пожить в нем, почувствовать, как луч этой доброты овладевает сердцем, словом и делами всей жизни. Доброта приходит не по обязанности, не в силу долга, а как дар. Чужая доброта – это предчувствие чего-то большего, во что даже не сразу верится; это теплота, от которой сердце согревается и приходит в ответное движение. Человек, раз испытавший доброту, не может не ответить (рано или поздно, уверенно или неуверенно) своею добротою. Это великое счастье - почувствовать в своём сердце огонь доброты и дать ему волю к жизни. В этот миг, в эти часы человек находит в себе своё лучшее, слышит пение своего сердца. Забывается «я» и своё, исчезает чужое, ибо оно становится «моим» и «мною». И для вражды и ненависти не остаётся места в душе.