需要一种Ruby方法来确定矩阵“触摸”另一个元素的元素

我认为我需要一种叫做“触摸”的方法(如连续的,而不是情绪化的。)我需要识别矩阵中与单个元素或元素集相邻的元素。 至少那是我想到的解决手头问题的方式。

下面的程序中的矩阵状态代表了一些水下地形。 随着我降低水量,最终将最高点伸出并变成“岛屿”。 当“水位”为34时,元素状态[2,3]是岛的单点。 atlantis数组保存该单点的坐标。

随着我们进一步降低水位,额外的点将“高于水面”。其他连续点将成为岛屿的一部分,它们的坐标将被添加到arrays亚特兰提斯。 (例如,下一块属于亚特兰蒂斯的土地将是国家[3,4],即31。)

我对如何做到这一点的想法是识别接触/位于亚特兰蒂斯元素旁边的所有矩阵元素,找到具有最高高度的矩阵元素,然后将其添加到亚特兰提斯数组中。 寻找单个元素旁边的元素本身就是一个挑战,但我们可以编写一些代码来检查集合[i,j-1],[i,j + 1],[i-1,j-1] ,[i-1,j],[i-1,j + 1],[i + 1,j-1],[i + 1,J],[i + 1,j + 1]。 (我想我做对了。)

但是当我们添加额外的点时,确定围绕atlantis中的点的哪些点的任务变得越来越困难。 所以这是我的问题:任何人都可以想到这样做的机制吗? 使用我不知道的rubyfunction的任何一种简化算法? (包括除最基本以外的所有内容。)如果可以编写这样的方法,那么我可以编写atlantis.touching并获得一个数组,例如,包含目前与atlantis相邻的所有点的所有坐标。

至少我认为这可以做到这一点。 任何其他想法都会受到欢迎。 如果有人知道任何类型的合作网站,我可以寻找可能有兴趣与我合作的其他人,这将是伟大的。

# create State database using matrix require 'matrix' State=Matrix[ [3,1,4,4,6,2,8,12,8,2], [6,2,4,13,25,21,11,22,9,3,], [6,20,27,34,22,14,12,11,2,5], [6,28,17,23,31,18,11,9,18,12], [9,18,11,13,8,9,10,14,24,11], [3,9,7,16,9,12,28,24,29,21], [5,8,4,7,17,14,19,30,33,4], [7,17,23,9,5,9,22,21,12,21,], [7,14,25,22,16,10,19,15,12,11], [5,16,7,3,6,3,9,8,1,5] ] #find sate elements contiguous to island atlantis=[[2,3]] find all state[i,j] "touching" atlantis 

只检查当前暴露区域周围的点并不像它可以覆盖所有情况 – 如果下一个要暴露的点是新岛的开始怎么办?

我会这样做:有另一个数组 – 让我们称之为sorted ,其中包含按高度排序的点数。 每当你提高水位时,将所有元素都高于新的水位,并将其sortedatlantis

实际上,如果你这样做,就不需要单独的sortedatlantis数组。 只存储不在水面以上的最高点的索引,你基本上有两个arrays在一起 – 一边是水面以上,另一边是水面以下的一切。

希望有所帮助!