2016-03-23 3 views
1

Итак, моя проблема в следующем: я хочу, учитывая некоторую точку с X, Y-координатами в сетке, вернуть все свои соседние ячейки.ECLiPSe clp: получение всех смежных ячеек в сетке

(Примечание: в следующих примерах я использую обозначение UL = верхний левый, UM = верхний-средний, UR = верхний правый, L = левый, R = правый, BL = нижний левый, БМ = нижний средний и BR = нижний правый)

Например:.

Для элемента х в точке (3,3) на сетке 5х5

_ _ _ _ _ 
_ UL UM UR _ 
_ L x R _ 
_ BL BM BR _ 
_ _ _ _ _ 

Для Ele Ment х в точке (1,1) на сетке 5х5

x R _ _ _ 
BM BR _ _ _ 
_ _ _ _ _ 
_ _ _ _ _ 
_ _ _ _ _ 

Теперь, как можно видеть в приведенных выше примерах, количество клеток, прилегающее к нашему текущему элементу х может изменяться в зависимости от X, Y -координаты самого элемента x.

Я хотел решить это, сказав, что каждый X слева и справа от заданной координаты X, а также каждый Y выше и ниже указанной координаты Y должен находиться в области 1..N, а затем определять их фактические значения:

% Adj_cells/2 : (X,Y) coordinate, board width/height N 
adjacent_cells((X,Y),N) :- 
    [Xleft,Xright,Yup,Ydown] #:: 1..N, 
    Xleft #= X-1, Xright #= X+1, 
    Yup #= Y-1, Ydown #= Y+1, 
    ... 

Однако, конечно, это оценивается как false при пересечении границы доски.

Я надеялся, что мне явно не нужно будет различать ситуации, связанные с границами борта; вместо этого я пытаюсь найти что-то, что вместо того, чтобы оценивать значение false, когда достигается координата вне привязки, просто «отбрасывает» этот результат и пытается вычислить другие соседние ячейки.

Я уверен, что в ECLiPSe будет небольшое небольшое решение, но я искал документы и, как далеко, не могу найти что-то, что соответствует моим потребностям.

Любая помощь очень ценится!

ответ

3

Вы не сказали, в какой форме вы хотите, чтобы «вернуть» соседние клетки, но если вы просто хотите, чтобы «сделать» что-то для каждого соседа, вы могли бы использовать этот шаблон:

adjacent_cells([X,Y], N) :- 
    (multifor([I,J], [max(1,X-1),max(1,Y-1)], [min(N,X+1),min(N,Y+1)]), param(X,Y) do 
     ([I,J]==[X,Y] -> true ; 
      writeln([I,J]) 
     ) 
    ). 

который дает, например,

?- adjacent_cells([1, 3], 6). 
[1, 2] 
[1, 4] 
[2, 2] 
[2, 3] 
[2, 4] 
Yes (0.00s cpu) 
+0

Точно, что я искал, это имеет смысл, спасибо! – SND

 Смежные вопросы

  • Нет связанных вопросов^_^