Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Лабиринт/матрица
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию Лабиринт/матрица - 05.10.2014, 11:03

Помогите пожалуйста решить следующую задачу.
Имеется матрица N * N. Задача: найти все пути от клетки до клетки.

Пока что додумался до следующего:
prolog Код:
% описывает путь до соседней клетки
way([X, Y], [A, B], Max) :- ((A is X + 1, B is Y) ; (B is Y + 1, A is X) ;
 (B is Y - 1, A is X) ; (A is X - 1, B is Y)),
A =< Max, B =< Max, X =< Max, Y =< Max, A >= 1, B >= 1, X >= 1, Y >= 1.
 
maze(Goal, Goal, Blocks, Max, []).
 
%Начальные координаты, Цель, Макс размер матрицы, Список ходов
maze(Start, Goal, Blocks, Max, [Interm | Moves]) :- way(Start, Interm, Max),
not(member(Interm, Moves)), maze(Interm, Goal, Blocks, Max, Moves).
Код вроде бы работает, когда все данные вводятся вручную. Например:
prolog Код:
maze([1,1], [1,4], [], 4, [[2,1],[2,2],[2,3],[2,4],[1,4]]).
true .
Но сам путь не находится:
prolog Код:
trace,maze([1,1], [1,4], [], 4, X).
   Call: (7) maze([1, 1], [1, 4], [], 4, _G410) ? creep
   Call: (8) way([1, 1], _G534, 4) ? creep
   Call: (9) _G537 is 1+1 ? creep
   Exit: (9) 2 is 1+1 ? creep
   Call: (9) _G540 is 1 ? creep
   Exit: (9) 1 is 1 ? creep
   Call: (9) 2=<4 ? creep
   Exit: (9) 2=<4 ? creep
   Call: (9) 1=<4 ? creep
   Exit: (9) 1=<4 ? creep
   Call: (9) 1=<4 ? creep
   Exit: (9) 1=<4 ? creep
   Call: (9) 1=<4 ? creep
   Exit: (9) 1=<4 ? creep
   Call: (9) 2>=1 ? creep
   Exit: (9) 2>=1 ? creep
   Call: (9) 1>=1 ? creep
   Exit: (9) 1>=1 ? creep
   Call: (9) 1>=1 ? creep
   Exit: (9) 1>=1 ? creep
   Call: (9) 1>=1 ? creep
   Exit: (9) 1>=1 ? creep
   Exit: (8) way([1, 1], [2, 1], 4) ? creep
^  Call: (8) not(member([2, 1], _G535)) ? creep
^  Fail: (8) not(user:member([2, 1], _G535)) ? creep
   Redo: (8) way([1, 1], [_G537, _G540], 4) ? creep
   Call: (9) _G540 is 1+1 ? creep
   Exit: (9) 2 is 1+1 ? creep
   Call: (9) _G537 is 1 ? creep
   Exit: (9) 1 is 1 ? creep
и т.д.
Сравнение not(member()) не проходит.
Можно ли тут что-то поделать или все в корне неверно?
Ответить с цитированием
  (#2 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию 05.10.2014, 22:24

Не дождавшись ответов, решил сам. Чуть позже выложу решение - вдруг пригодится кому-нибудь.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Волновой алгоритм в игре Лабиринт! Flaminger Алгоритмы 0 05.05.2013 03:19
Программа, реализующая лабиринт raendor Prolog 6 05.05.2012 14:35
Лабиринт и бегающия в нём змейка Gantzer Visual Basic 0 21.06.2011 16:09
Лабиринт с сокровищами. Ler Ko Prolog 0 03.02.2011 18:08
3-х мерный лабиринт master173s Prolog 6 20.12.2009 18:50
Лабиринт Smt Prolog 0 25.05.2008 23:56
Задача лабиринт как ее написать gleban Алгоритмы 9 24.05.2008 17:50
лабиринт на прологе solusrex Prolog 3 10.01.2007 23:49
Лабиринт в VB 6.0... I'm desperate... KoZa Visual Basic 7 22.05.2006 02:50
Лабиринт и змейка SpartakCh Prolog 1 19.12.2005 00:18
Как найти лабиринт на Prolog ckl Prolog 3 28.11.2004 00:53
Написать программу Лабиринт на С++ Anonymous Вопросы начинающих программистов 2 09.11.2004 23:21



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов