Matrix 检查矩阵索引列表是否相邻
给定一个索引列表和矩阵大小N,我想检查该列表的索引是否是连续的 例如,矩阵5x5,索引如下:Matrix 检查矩阵索引列表是否相邻,matrix,prolog,geometry,logic,Matrix,Prolog,Geometry,Logic,给定一个索引列表和矩阵大小N,我想检查该列表的索引是否是连续的 例如,矩阵5x5,索引如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 isContiguous([11,12,13,7,2], 5) :- yes. isContiguous([14,15,16,17,18], 5) :- no. 我尝试实现深度优先搜索,从第一个索引开始并检查以下内容是否连续,但我做不到,因为它只在
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
isContiguous([11,12,13,7,2], 5) :- yes.
isContiguous([14,15,16,17,18], 5) :- no.
我尝试实现深度优先搜索,从第一个索引开始并检查以下内容是否连续,但我做不到,因为它只在列表形成一行或一列且第一个元素位于该形状的开头或结尾时才起作用
感谢您的时间:)您可以定义节点邻接的关系和查看节点之间是否存在单个连接图的过程:
:-use_module(library(clpfd)).
adjacent(Size, N, _, Adj):-
Adj #= N-Size,
Adj #> 0.
adjacent(Size, N, Max, Adj):-
Adj #= N+Size,
Adj #=< Max.
adjacent(Size, N, _, Adj):-
0 #\= N mod Size,
Adj #= N+1.
adjacent(Size, N, _, Adj):-
1 #\= N mod Size,
Adj #= N-1.
is_contiguous(L, Size):-
Max #= Size*Size,
between(1, Max, Len), % sanity checks for when L is not instantiated
length(L, Len),
select(N, L, L1),
between(1, Max, N), % idem
is_contiguous1([N], L1, Size, Max).
is_contiguous1(_, [], _, _).
is_contiguous1(Seen, Rem, Size, Max):-
member(N, Seen),
adjacent(Size, N, Max, Adj),
\+(member(Adj, Seen)),
select(Adj, Rem, NRem),
is_contiguous1([Adj|Seen], NRem, Size, Max).
不,DFS也适用于分支结构-在完成一个分支后,搜索返回到早期节点继续。这与几何体有何关系?@GuyCoder抱歉,感谢您的时间:)我认为您的第三个示例是错误的,因为15与19相邻,但16与19不相邻。在我检查第三个示例之前,我实际上更喜欢你的答案。我的解决方案检查输入节点是否只有一个连通图。节点的顺序并不重要。如果问题是找到一条路径,一个简单的DFS就能解决它
?- is_contiguous([11,12,13,7,2], 5).
true.
?- is_contiguous([14,15,16,17,18], 5).
false.
?- once(is_contiguous([14,15,X,16,17,18], 5)).
X = 19