2016-03-23 60 views
1

所以我的問題是以下幾點:我想,給定點X座標,在網格中的Y座標,以返回其所有相鄰的單元格。 (注意:在下面的例子中,我使用符號UL =左上,UM =中上,UR =右上,L =左,R =右,BL =左下,上的5×5網格ECLiPSe clp:獲取網格上的所有相鄰單元

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

對於

對於元素x在(3,3):BM =底部中間和BR =右下)

EG。 ELE精神疾病上的5x5的網格X在(1,1)現在

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, 
    ... 

然而,當董事會的邊界越過時,它的計算結果爲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