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)
Другие вопросы по тегам