检查矩阵索引列表是否相邻

时间:2018-12-11 15:05:06

标签: matrix prolog geometry logic

给出索引列表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

我尝试实现深度优先搜索,从第一个索引开始,然后检查以下内容是否连续,但是我不能,因为只有在列表中包含一行或一列并且第一个元素位于其中时,它才有效形状的开始或结尾。

谢谢您的时间:)

1 个答案:

答案 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