2012-07-27 4 views
1

"감동"이라고하는 메서드가 필요합니다. (인접하지 않고 감정적 인 것처럼) 매트릭스의 요소를 식별해야합니다. 개별 요소 또는 요소 집합 옆에 표시됩니다. 적어도 내가 당면한 문제를 해결하기 위해 생각한 방식이다.매트릭스 요소를 결정하기 위해 루비 방법이 필요합니다.

아래의 프로그램에서 행렬 상태는 수중 지형을 나타냅니다. 내가 물을 내리면 결국 가장 높은 지점이 튀어 나와서 "섬"이됩니다. "수위"가 34 일 때 원소 상태 [2,3]가 섬의 단일 지점입니다. 배열 atlantis는 단일 점의 좌표를 유지합니다.

수위를 더 낮추면 추가 포인트가 "물 위"가됩니다. 추가 인접 포인트는 섬의 일부가되며 좌표가 배열 atlantis에 추가됩니다. (예를 들어, 아틀란티스의 일부가 될 다음 토지는 31 번 주입니다.)

내 생각에이 방법은 옆에있는 모든 행렬 요소를 식별하기위한 것입니다. 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] (내가 맞다고 생각해.)

그러나 우리가 추가로 포인트를 추가함에 따라, 어떤 포인트가 아트런티에서 포인트를 둘러 쌈을 결정하는 작업이 점점 더 어려워지고 있습니다. 그래서 그것은 제 질문입니다. 누구든지이 작업을 수행 할 수있는 메커니즘을 생각할 수 있습니까? 루비의 기능을 사용하는 모든 종류의 단순화 된 알고리즘은 내가 모르고 있습니까? (가장 기본적인 것을 제외한 모든 것을 포함합니다.) 그런 방법이 쓰여질 수 있다면, 필자는 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으로 전화를 걸자. 수위를 올릴 때마다 새로운 수위보다 높은 모든 요소를 ​​sorted에서 atlantis으로 이동합니다.

실제로 이렇게하면 별도의 sortedatlantis 어레이가 필요하지 않습니다. 가장 높은 점 의 지수를 물 위의이 아닌 위치에 저장하면 기본적으로 한쪽에는 물 위의 모든 것이고 다른 한쪽에는 물 아래의 모든 배열이 있습니다.

희망 하시겠습니까?

+0

다른 지점이 인접한 영역에 집중해야하는 다른 섬 (또는 나중에 atlantis와 병합)이 될 수 있기 때문입니다. atlantis가 미리 설정된 크기에 도달하면, 나는 그것을 "제거"하고 다음으로 높은 지점에서 동일한 과정을 반복합니다. 정렬 된 가능성이 있지만, 그것에 대해 생각할 필요가 있습니다. – user918069

+0

정렬은 유용 할 수 있지만 그 자체로는 문제를 해결할 수 없습니다. 나는 높고 인접한 포인트를 찾아야한다. – user918069

+0

@ user918069 - [A * 알고리즘] (https://en.wikipedia.org/wiki/A*)을 확인하십시오.일반적으로 경로를 찾는 데 사용되지만 몇 번의 조작으로 가장 높은 연속 점 목록을 제공합니다. 그래도 출발점을 제공해야합니다. –

관련 문제