给出索引列表List和矩阵大小N,我想检查该列表的索引是否连续。
例如,矩阵5x5,索引如下:
doctrine:
dbal:
connections:
default:
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
custom:
url: '%env(resolve:DATABASE_URL_CUSTOM)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
我尝试实现深度优先搜索,从第一个索引开始,然后检查以下内容是否连续,但是我不能,因为只有在列表中包含一行或一列并且第一个元素位于其中时,它才有效形状的开始或结尾。
谢谢您的时间:)
答案 0 :(得分:1)
您可以定义一个节点邻接关系和一个过程,以查看节点之间是否存在单个连接图:
:-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).
样品运行:
?- 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