ECLiPSe clp: получение всех соседних ячеек на сетке
Поэтому моя проблема заключается в следующем: я хочу, учитывая некоторую точку с координатами X,Y в сетке, вернуть все смежные ячейки.
(Примечание: в следующих примерах я использую обозначение UL = верхний левый, UM = верхний средний, UR = верхний правый, L = левый, R = правый, BL = нижний левый, BM = нижний средний и BR = внизу справа.)
Например:
Для элемента х в (3,3) на сетке 5х5
_ _ _ _ _
_ UL UM UR _
_ L x R _
_ BL BM BR _
_ _ _ _ _
Для элемента x в (1,1) на сетке 5x5
x R _ _ _
BM BR _ _ _
_ _ _ _ _
_ _ _ _ _
_ _ _ _ _
Теперь, как видно из приведенных выше примеров, количество ячеек, смежных с нашим текущим элементом x, может варьироваться в зависимости от 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,
...
Однако, конечно, это оценивается как ложное всякий раз, когда граница доски пересекается.
Я надеялся, что мне не нужно будет четко различать ситуации, касающиеся границ совета; вместо этого я пытаюсь найти что-то, что вместо того, чтобы оценивать как ложное всякий раз, когда достигается внешняя координата, просто "отбрасывает" этот результат и пытается вычислить другие соседние ячейки.
Я уверен, что в ECLiPSe найдется хорошее решение для этого, но я искал документы и, так далеко, не могу найти то, что соответствует моим потребностям.
Любая помощь очень ценится!
1 ответ
Вы не сказали, в какой форме вы хотите "вернуть" соседние ячейки, но если вы просто хотите "сделать" что-то для каждого соседа, вы можете использовать этот шаблон:
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)