2010-04-09 3 views
2

자바로 수행 할 작은 프로그램이 있습니다. 나는 0과 1로 채워진 2D 배열을 가지고 있으며, 가장 큰 마름모 (사각형에서 45도 회전 한 것과 같이)와 그 숫자를 찾아야합니다.동적 프로그래밍 : 가장 큰 다이아몬드 (마름모) 찾기

예 :

 
0 1 0 0 0 1 

1 0 1 1 1 0 

1 0 1 1 1 1 

0 1 1 1 1 1 

0 0 1 1 1 1 

1 1 1 1 1 1 

결과 :

 
     1  

    1 1 1 

    1 1 1 1 1 

    1 1 1 

     1  

this SO question 문제는 유사하다.

아이디어가 있으면 여기에 게시하십시오.

+5

우리에게는 아마도 많은 아이디어가 있지만 숙제가 아닙니다. 너는 무엇을 성취 했는가? –

+0

정의에 따르면, 마름모는 같은 길이의 4면을 가져야하지만 내부 각이 90 도일 필요는 없습니다. 어떤 종류의 가장 큰 마름모를 찾아야합니까, 아니면 가장 큰 45도 회전 사각형을 찾을 수 있습니까? (샘플 결과로 인해 45도를 의미한다고 가정합니다. 90도 회전 된 사각형은 원본과 동일합니다.) – Pops

+0

@Lord Torgamus : 분명히 "2D 배열"을 나타내는 데 사용 된 표현에서 최대 45 점 -degrees rotate square ... (선 그리기/교차점/정밀도 문제로 인해 문제를 해결하는 행운을 빕니다.) – SyntaxT3rr0r

답변

3

댓글에 너무 오래 사용했습니다. 당신이 그것을 해결할 수 없다면 나중에 해결책을 게시 할 것이지만, 나는 그것을 (코드의 15 줄 이하에서) 어떻게 했는가? 나는 처음에 두 번째 배열을 만들었다. (더 큰 [n + 2]

0 0 0 0 0 0 0 0 
0 0 1 0 0 0 1 0 
0 1 0 1 1 1 0 0 
0 1 0 1 2 2 1 0 
0 0 1 2 2 2 1 0 
0 0 0 1 2 2 1 0 
0 1 1 1 1 1 1 0 
0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 
0 0 1 0 0 0 1 0 
0 1 0 1 1 1 0 0 
0 1 0 1 2 2 1 0 
0 0 1 2 3 2 1 0 
0 0 0 1 2 2 1 0 
0 1 1 1 1 1 1 0 
0 0 0 0 0 0 0 0 

비제 번호 X가 I와 함께 관련 크기를 표현하고있어 ("I 크기 X의 마름모의 중심 해요"의미 : N + 2) 및/2 패스 N 않았다 대각선의 길이 [두 경우 모두 동등한 마름모입니다]. {위쪽, 오른쪽, 아래쪽, 왼쪽}이 모두 크기 k의 마름모의 중심인지 확인하여 크기가 (k + 1) 인 마름모 중심이 있는지 확인할 수 있습니다.

더 큰 어레이를 처음 만드는 이점은 논리를 정말 단순화한다는 것입니다.하지만 원래의 어레이를 수정하거나 동일한 크기의 두 번째 배열을 사용하여 논리를 단순화 할 수 있습니다. 입력 (다시 한번 말하면, 입력 주위에 모두 0의 안전한 "펜스"를 넣는 것이 더 쉽습니다).

어레이를 울타리로 "둘러싸"지 않으면 if/else 검사가 추가로 많이 발생합니다. 오류가 발생하여 코드가 커지고 코드가 더 추악해질 수 있습니다.

+0

@Darksody : 코드가 정말로 필요하면 말해주세요. – SyntaxT3rr0r

+3

그가 숙제를위한 코드를 정말로 필요로한다면, 그는 그 일을 어렵게하기 때문에 연습을하기 위해 직접해야합니다. – Beska

+0

우아한. 좋은. +1. – Pops

2

짧은 튜토리얼 : 그것은 1x1 -field가 있다면

가 어떻게 문제를 해결할 것인가?
어떻게 재귀 적으로 문제를 공식화 할 수 있습니까?
어떻게 중간 결과를 기억하고 사용합니까?
하십시오.

0
void rhombus() 
{ 
    maxr=0; 
    for (int i=n-1;i>=0;i--) 
    { 
     for (int j=n-1;j>=0;j--) 
     { 
      if (b[i][j]>0) 
      { 
       if ((i==n-1) || (j==n-1) || (i==0) || (j==0)) b[i][j]=1; 
       else { 
        b[i][j]=min4(b[i][j+1],b[i][j-1],b[i+1][j],b[i-1][j])+1; 
        if (b[i][j]==maxr) nrr++; 
        else if (b[i][j]>maxr) { 
         nrr=1; 
         maxr=b[i][j]; 
        } 
       } 
      } 
     } 
    } 
} 

, 그것은 작동이 maxr이 마름모의 최대 크기이며, NRR는 최대의 수는이 거대한 배열에 어떻게 작동하는지 rhombus.Not 확실히 크기 내 기능입니다. 그것을했다 (내가 루프 이 함수는 n/2 번)

+0

당신의 도움, 특히 WizardOfOdds에 감사드립니다. 이상이 정말 좋습니다 .I 내 배열 주위에 그 0 경계를 사용하지 않았다, 나는 단지 블록이 가장자리에 있다면, 더 confortably 느꼈다. 감사합니다, 감사합니다 :) – Darksody