2012-07-27 15 views
1

我想我需要一種名爲「觸摸」的方法(如在連續的,不感性的) 我需要識別矩陣的那些元素緊挨着一個單獨的元素或一組元素。至少這是我想要解決手頭問題的方式。需要一種Ruby方法來確定矩陣「觸摸」另一個元素的元素

下面的程序中的矩陣狀態代表,比方說,一些水下地形。當我放下水時,最高點最終會突出併成爲「島嶼」。當「水位」在34時,元素狀態[2,3]是該島的單個點。數組atlantis保存該單點的座標。

隨着我們進一步降低水位,附加點將位於「水上」。其他連續點將成爲島的一部分,並且它們的座標將被添加到數組atlantis。 (例如,亞特蘭蒂斯的下一塊土地將是國家[3,4]在31)。

我想過如何做到這一點是識別所有的矩陣元素觸摸/旁邊在亞特蘭蒂斯的元素,找到最高的那個,然後將它添加到數組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

只有檢查點周圍的目前暴露面積聽起來並不像它可以涵蓋所有的情況下 - 是什麼,如果下一個點被暴露新島的開始?

我會這樣做的:有另一個數組 - 我們稱之爲sorted其中包含您的點按高度排序。每當你提高水位時,將所有高於新水位的元素都排除在外sortedatlantis

事實上,如果你這樣做,不需要單獨的sortedatlantis陣列。只需將最高點而不是的指數存儲在水面上,並且基本上將兩個陣列合併爲一個 - 一邊是水面以上的所有東西,另一邊是水面以下的所有東西。

希望有幫助!

+0

這是因爲其他點可能成爲其他島嶼(或後來與亞特蘭蒂斯合併),我需要把重點放在連續的區域。一旦atlantis達到預設尺寸,我將「刪除」它,並在剩下的下一個最高點重複相同的過程。排序有可能,但需要考慮。 – user918069 2012-07-27 12:13:56

+0

儘管排序可能有用,但它本身並不能解決問題。我需要找到既高又連續的點。 – user918069 2012-07-28 01:48:12

+0

@ user918069 - 查看[A *算法](https://en.wikipedia.org/wiki/A*)。它通常用於路徑查找,但是通過一些調整,它會給你一個最高連續點的列表。不過,你必須提供出發點。 – 2012-07-29 00:21:54

相關問題