ECLiPSe clp:获取网格上的所有相邻单元格
ECLiPSe clp : getting all adjacent cells on grid
所以我的问题如下:给定网格中具有 X、Y 坐标的点,我想要 return 它的所有相邻单元格。
( 注意:在以下示例中,我使用的符号 UL = 左上角,UM = 中上角,UR = 右上角,L = 左角,R = 右角,BL = 左下角, BM = 中下,BR = 右下。)
例如:
For element x at (3,3) on a 5x5 grid
_ _ _ _ _
_ UL UM UR _
_ L x R _
_ BL BM BR _
_ _ _ _ _
For element x at (1,1) on a 5x5 grid
x R _ _ _
BM BR _ _ _
_ _ _ _ _
_ _ _ _ _
_ _ _ _ _
现在,如上例所示,与当前元素 x 相邻的单元格数量可能会根据元素 x 本身的 X、Y 坐标而变化。
我想通过指定坐标的 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,只是 'discards' 结果并尝试计算其他相邻单元格。
我确信在 ECLiPSe 中会有一个不错的小解决方案,但我已经搜索了文档并且 - 到目前为止 - 似乎找不到适合我需要的东西。
非常感谢任何帮助!
你没有说你想以什么形式 "return" 相邻的单元格,但如果你只想 "do" 每个邻居的东西,你可以使用这种模式:
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)
所以我的问题如下:给定网格中具有 X、Y 坐标的点,我想要 return 它的所有相邻单元格。
( 注意:在以下示例中,我使用的符号 UL = 左上角,UM = 中上角,UR = 右上角,L = 左角,R = 右角,BL = 左下角, BM = 中下,BR = 右下。)
例如:
For element x at (3,3) on a 5x5 grid
_ _ _ _ _
_ UL UM UR _
_ L x R _
_ BL BM BR _
_ _ _ _ _
For element x at (1,1) on a 5x5 grid
x R _ _ _
BM BR _ _ _
_ _ _ _ _
_ _ _ _ _
_ _ _ _ _
现在,如上例所示,与当前元素 x 相邻的单元格数量可能会根据元素 x 本身的 X、Y 坐标而变化。
我想通过指定坐标的 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,只是 'discards' 结果并尝试计算其他相邻单元格。
我确信在 ECLiPSe 中会有一个不错的小解决方案,但我已经搜索了文档并且 - 到目前为止 - 似乎找不到适合我需要的东西。
非常感谢任何帮助!
你没有说你想以什么形式 "return" 相邻的单元格,但如果你只想 "do" 每个邻居的东西,你可以使用这种模式:
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)