2012-04-03 2 views
0

내가 뭘 해야할지는 랜덤 블랙 (0)과 화이트 (1) 블록으로 구성된 사각형 보드에서 인접한 흰색 블록 (2로)의 수를 세는 것입니다. . 흰색 블록은 i+1,j에 있어야합니다. i-1,j || i,j+1 || i,j-1. 기술적으로 대각선은 계산되지 않습니다. 여기보드 게임에 대한 엉망이 재귀 코드

[1 0 1] 
[1 1 0] 
[0 1 0] 

여기 (0,0)(1,0) and (1,0)(1,1) and (1,1)(2,1)

count == 3 내 코드입니다 : 내가 여기서 뭘하려고하고 무엇을

public int count = 0; 
    boolean count(int x, int y, int[][] mat) 
    { 
     if(x<0 || y<0) 
      return false; 
     if(mat[x][y] == 0) 
      return false; 

     for(int i = x; i<mat.length; i++) 
     { 
      for(int j = y; j<mat[0].length; j++) 
      { 
       if(mat[i][j] == 1) 
       { 
        mat[i][j] = 0; 
        if(count(i-1,j,mat)) 
         count++; 
        if(count(i,j-1,mat)) 
         count++; 
        if(count(i+1,j,mat)) 
         count++; 
        if(count(i,j+1,mat)) 
         count++; 
       } 
      } 
     } 
     return true; 
    } 

짧은 설명 : 나는 하나의를 찾는 것에 대해 갈거야 내가 아래 예제를 제공 한 보드에서 1을 찾았을 때 0으로 변경하고 위, 아래, 왼쪽, 오른쪽 1을 확인합니다. 이것은 인접한 1을 찾을 때까지 계속됩니다. 내가 여기서 누락 된 것은 무엇입니까? 나는 불필요하게 반복하고있는 느낌이 든다.

+1

숙제 용입니까? –

+1

재귀를 사용해야합니까? – twain249

+0

이것은 숙제가 아니며 재귀를 사용해야 할 필요도 없습니다. 방금 생각했습니다. 더 나은 해결책이 있다면, 나는 알고 싶습니다. – noMAD

답변

2

여기 재귀

for(int i = 0; i < mat.length; i++) { 
    for(int j = 0; j < mat[i].length; j++) { 
     if(mat[i][j] == 1) { 
      if(i < mat.length - 1 && mat[i+1][j] == 1) { 
       count++; 
      } 
      if(j < mat[i].length - 1 && mat[i][j+1] == 1) { 
       count++; 
      } 
    } 
} 
1

없이 해결책 난 당신이 단지 인 (인접한 값을 찾기 위해) 한 단계 깊이 갈해야으로 재귀가 정답이라고 생각하지 않습니다. 대신 오른쪽과 아래를 보면서 요소를 반복하면됩니다. 당신이 두 번 카운트 매치를하지 않도록 언급 된 트윈으로 보거나 남기지 마라. 다음은 간단합니다 :

for (i=0; i<max; i++) 
    for (j=0; j<max; j++) 
    if (array[i][j] == 1){ 
     if (i<max-1 && array[i+1][j] == 1) count++; 
     if (j<max-1 && array[i][j+1] == 1) count++; 
    } 
관련 문제