我想我需要一种叫做“触摸”的方法(如连续的,不是情绪化的)。 我需要识别单个元素或元素集旁边的矩阵元素。至少那是我想到的解决手头问题的方式。
以下程序中的矩阵状态代表了一些水下地形。随着我降低水量,最终将最高点伸出并成为一个“岛屿”。当“水位”为34时,元素状态[2,3]是岛的单点。 atlantis数组保存该单点的坐标。
当我们进一步降低水位时,额外的点将“高于水面。”其他连续点将成为岛屿的一部分,它们的坐标将被添加到阵列亚特兰提斯。 (例如,下一块属于亚特兰蒂斯的土地将是31国的国家[3,4]。)
我对如何做到这一点的想法是识别atlantis中元素旁边的所有矩阵元素,找到具有最高高度的元素,然后将其添加到atlantis数组中。寻找单个元素旁边的元素本身就是一个挑战,但是我们可以编写一些代码来检查集合[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]。 (我想我做对了。)
但是当我们添加额外的点时,确定围绕亚特兰提斯点的哪些点的任务变得越来越困难。所以这是我的问题:任何人都可以想到这样做的任何机制吗?任何类型的简化算法使用我不知道的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
答案 0 :(得分:0)
只检查当前暴露区域周围的点并不能说明它可以覆盖每一个案例 - 如果下一个要暴露的点是新岛的开头怎么办?
我会这样做:有另一个数组 - 让我们称之为sorted
,其中包含按高度排序的点数。每次提高水位时,将所有元素都高于sorted
以后的新水位,并弹到atlantis
。
事实上,如果你这样做,就不需要单独的sorted
和atlantis
数组。只需将不的最高点的索引存储在水面上,并且你基本上有两个阵列在一起 - 一边是水面上的一切,另一面是水面下的一切。
希望有所帮助!