需要一种Ruby方法来确定矩阵的元素;感人的;另一个因素

需要一种Ruby方法来确定矩阵的元素;感人的;另一个因素,ruby,algorithm,matrix,Ruby,Algorithm,Matrix,我想我需要一种称为“触摸”的方法(如连续的,而不是情感的) 我需要识别矩阵中与单个元素或元素集相邻的元素。至少这是我想到的解决手头问题的方法 下面程序中的矩阵状态表示,比方说,一些水下地形。当我降低水位时,最高点最终会突出,变成一个“岛”。当“水位”为34时,元素状态[2,3]为岛的单点。亚特兰蒂斯阵列拥有该单点的坐标 随着水位进一步降低,更多的点将“在水面上”。更多的连续点将成为岛屿的一部分,它们的坐标将添加到亚特兰蒂斯阵列中。(例如,下一块属于亚特兰蒂斯的土地将在31岁时成为州[3,4])

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

下面程序中的矩阵状态表示,比方说,一些水下地形。当我降低水位时,最高点最终会突出,变成一个“岛”。当“水位”为34时,元素状态[2,3]为岛的单点。亚特兰蒂斯阵列拥有该单点的坐标

随着水位进一步降低,更多的点将“在水面上”。更多的连续点将成为岛屿的一部分,它们的坐标将添加到亚特兰蒂斯阵列中。(例如,下一块属于亚特兰蒂斯的土地将在31岁时成为州[3,4])

我的想法是如何识别亚特兰蒂斯中与元素相邻的所有矩阵元素,找到海拔最高的元素,然后将其添加到阵列亚特兰蒂斯中。寻找单个元素旁边的元素本身就是一个挑战,但我们可以编写一些代码来检查集合[i,j-1]、[i,j+1]、[i-1,j-1]、[i-1,j+1]、[i+1,j-1]、[i+1,j]、[i+1,j+1]。(我想我是对的。)

但随着我们增加更多的点,确定亚特兰蒂斯点周围的点变得越来越困难。这就是我的问题:有人能想出任何机制来做到这一点吗?我不知道有哪种使用ruby功能的简化算法?(包括除最基本的以外的所有方法。)如果可以编写这样的方法,那么我可以编写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
并进入
atlantis

事实上,如果这样做的话,就不需要单独的
排序
亚特兰蒂斯
数组。只要把最高点的指数存储在不高于水的地方,你就基本上在一个数组中有两个数组——一边是高于水的数组,另一边是低于水的数组


希望有帮助

这是因为其他点可能成为其他岛屿(或稍后与亚特兰蒂斯合并),所以我需要关注相邻区域。一旦亚特兰蒂斯号达到预设尺寸,我将“移除”它,并在下一个最高点重复相同的过程。虽然排序有可能,但需要考虑一下。虽然排序可能有用,但它本身并不能解决问题。我需要找到既高又连续的点。@user918069-请查看。它通常用于路径查找,但通过一些调整,它将为您提供最高连续点的列表。不过,你必须提供出发点。如果你能让它绕着岛转一圈,那就行了。您可以通过在起始位置和紧邻它的结束位置之间构建一个足够大的“块”来实现这一点。然而,所有这些都远远超出了我的编程能力,我无法做到这一点。谢谢你的建议。