【问题标题】:Check if List of Matrix Indexes are adjacent检查矩阵索引列表是否相邻
【发布时间】:2018-12-11 15:05:06
【问题描述】:

给定一个索引列表 List 和矩阵大小 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.

我尝试实现深度优先搜索,从第一个索引开始并检查以下是否连续,但我做不到,因为它仅在列表构成一行或一列且第一个元素位于该形状的开头或结尾。

感谢您的宝贵时间:)

【问题讨论】:

  • 不,DFS 也适用于分支结构 - 完成一个分支搜索后返回到较早的节点继续。
  • 这与几何有什么关系?
  • @GuyCoder 抱歉,感谢您抽出宝贵时间 :)

标签: matrix prolog geometry logic


【解决方案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

【讨论】:

  • 我认为您的第三个示例是错误的,因为 15 与 19 相邻,但 16 与 19 不相邻。实际上,在检查第三个示例之前,我更喜欢您的答案。
  • 我的解决方案检查输入节点是否只有一个连通图。节点的顺序无关紧要。如果问题是要找到一条简单的 DFS 可以解决的路径
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2019-03-09
  • 2023-03-25
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多