2015-04-06 48 views
-1

我有一个矩阵给定一个矩阵,我该如何判断一些值是否是邻居?

([ 1, 2, 3, 4], 
[ 5, 6, 7, 8], 
[ 9, 10, 11, 12], 
[ 13, 14, 3, 16], 
[ 2, 18, 19, 20]) 

和搜索字符串。其任务是找出搜索字符串中的数字是否是矩阵中沿x和y坐标彼此靠近的值。

  • "2,7,12,16"应返回true
  • "2,4,7,12"应返回true
  • "1,6,8,12"应该返回false
  • "1,5,14,15"应该返回false

&validateMatrix($number2search,\@matrix); 

sub validateMatrix{ 
    my($a,$d) = @_; 
    my @s = split(",",$a); 
    my @matrix = @{$d}; 

    ??? 
    ?? 
    return(true or false) 
} 
+0

请显示您所写的代码并描述您遇到的问题 – Borodin

+0

我需要关于perl如何解决上述问题的算法。感谢 – perlbie

+0

我已经使用A星寻路通过转换不匹配的元素为零试过,但还是......需要一个适当的算法来处理这个问题! – perlbie

回答

1

我不确定你算法中的邻居是什么。矩阵是否被认为是周期性的?无论哪种情况,算法如下。

  1. 创建从数字到开始位置的映射:将数字散列到位置数组。
  2. 为所有位置创建一个邻居映射:散列位置(将数字散列为阵列位置) - 或者只是将数字散列为位置,如果只能有一个具有该数字的邻居。
  3. 对于每个搜索字符串:
    1. 初始化由起始映射返回的数组的位置可能性。
    2. 遍历剩余的数字,从邻居映射中获取下一个可能的位置。
    3. 如果你没有位置的可能性,这不是一个匹配。

第2步是可选的,因为你可以只通过寻找搜索步骤中匹配的邻居迭代,但它有助于分离出的担忧。

和开始映射也可以被认为只是一个特殊的位置,邻居们所有其他位置,从而简化了后来的算法,以及因为你没有特殊情况下,在搜索字符串的第一个数字。

+0

嗨; TimTom,感谢这个算法让我可以将它用于脚本。 – perlbie

+0

嗨; TimTom,如果邻居有多个相同的号码,那么返回的位置将不正确。 – perlbie

+0

这是正确的。这就是为什么在第二步,我们有位置的散列数的散列位置的阵列。我甚至专门打电话表示出来的意见是,如果你没有,你可以做别的事情。 –

相关问题