Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2015, 23:29   #1
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
Стрелка Кратчайший путь коня [Haskell]

Нужно найти кратчайший путь коня на шахматной доске от заданного поля до конечного. Нашла код, использующий поиск в ширину, но он не оптимизированный. При задании "mapM_ printMoves $ shortestPath (1,1) (5,5)" , например в WinHugs выдает ошибку ERROR - Garbage collection fails to reclaim sufficient space, а GHCi вообще виснет.

как оптимизировать, чтобы работало для доски размером 8*8?

Код:
import Data.List(intersperse)
 
move :: (Int,Int) -> [(Int,Int)]
move (x,y) = filter (\(a,b) -> 0 < a && a <= 8 && a < b && b <= 8) [
  (x+2,y+1),
  (x-2,y+1),
  (x+2,y-1),
  (x-2,y-1),
  (x+1,y+2),
  (x+1,y-2),
  (x-1,y+2),
  (x-1,y-2)]
 
type Path = [(Int,Int)]
 
step :: [Path] -> [Path]
step paths = do
  path@(pos:_) <- paths
  map (:path) $ move pos
 
initiate :: (Int,Int) -> [Path]
initiate pos = [[pos]]
 
shortestPath :: (Int,Int) -> (Int,Int) -> [Path]
shortestPath start destination = let
  steps = iterate step (initiate start) :: [[Path]]
  filterActual = map $ filter (\(last:prev) -> last == destination) :: [[Path]] -> [[Path]]
  in map reverse . head . filter (not.null) $ filterActual steps
 
printMoves :: Path -> IO ()
printMoves = putStrLn . concat . intersperse "-" . map show
MariaD вне форума Ответить с цитированием
Старый 04.05.2015, 09:50   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Могу дать код на Паскале\С++, если надо..
Poma][a вне форума Ответить с цитированием
Старый 04.05.2015, 11:44   #3
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
По умолчанию

нет, спасибо. паскаль это императивный язык, а хаскел декларативный. у них разные принципы работы.
MariaD вне форума Ответить с цитированием
Старый 04.05.2015, 12:35   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Так алгоритм работы-то один и тот же, разве не так?
Вадим Мошев вне форума Ответить с цитированием
Старый 04.05.2015, 13:13   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

MariaD, если оптимально - то это BFS (поиск в глубину). Можно реализовать на основе алгоритма Ли. Все отличия от алгоритма Ли - отсутствие непроходимых клеток, 8 (а не 4) "соседей", 8 других условий для "соседей".
На Розетте был пример поиска пути из лабиринта для Haskell.

Теперь у вас ещё один пример... Но зато вместе с идеей, что менять.
FPaul вне форума Ответить с цитированием
Старый 05.05.2015, 11:26   #6
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
По умолчанию

Всем спасибо, все работает
MariaD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кратчайший путь ILovePascal Паскаль, Turbo Pascal, PascalABC.NET 2 11.12.2013 12:26
(с++) Кратчайший путь в графе Uefa Помощь студентам 15 04.12.2013 15:50
Кратчайший путь к точке W0LF Общие вопросы Delphi 3 17.05.2011 15:40
Путь коня. xaero93 Помощь студентам 4 28.11.2010 10:03