2015-01-08 7 views
0

자바에서 재귀와 함께 스도쿠 해결사를 만들고 있습니다.재귀에 의한 스도쿠 (Sudoku) 재귀에 의한 바운드 에러 - Java

public boolean fsolve(int i, int j){ 
    if (j >= this.SIZE){ 
     i++; 
     if (i>=this.SIZE){ 
      return true; 
     } 
    } 
    if (!this.isEmpty(i,j)){ 
     return fsolve(i,j+1); 
    } 
    for (int curval = 1; curval < 10; curval++){ 
     if ((this.tryValue(curval, i, j)) && (this.fsolve(i, j+1))){ 
      return true; 
     } 
    } 
    this.clear(i, j); 
    return false; 
    } 

이것은 내 해결 기능입니다.

tryValue 함수는 위치 i, j에서 구부리기를 시도합니다.

클리어 기능 제가, J가 될 위치의 값을 설정 0

전체 스도쿠 int로 불리는 모델 [] []로로드 및 I는 행, 열 및 상자를 체크하는 기능을 만들었다 . 그들은 모두 의도 한대로 작동합니다.

내 해결 함수가 나를 쓰러 뜨리고 범위를 벗어났습니다. 오류가 발생했습니다. 내 기능이 제대로 작동 할 것이라고 믿기 때문에 지금 갈 방법이 확실하지 않습니다.

이것은 말씀입니다 :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9 
    at Field.isEmpty(Field.java:99) 
    at Field.fsolve(Field.java:161) 
    at Field.fsolve(Field.java:165) 
    at Field.fsolve(Field.java:165) 
    at Field.fsolve(Field.java:162) 
    at Field.fsolve(Field.java:165) 
    at Field.fsolve(Field.java:165) 
    at Field.fsolve(Field.java:162) 
    at Field.fsolve(Field.java:162) 
    at Field.fsolve(Field.java:165) 
    at Field.fsolve(Field.java:165) 
    at Sudoku.main(Sudoku.java:6) 

기능이 라인에서 시작 해결 내 152

나의 IsEmpty 함수의 기능은 다음과 같습니다

여기
public boolean isEmpty(int i, int j) { 
    if (this.model[i][j] == 0){ 
     return true; 
    } 
    return false; 
} 

내 tryValue 기능입니다 :

public boolean tryValue(int val, int i, int j) { 
if (!checkRow(val, i)) { 
    return false; 
} 
if (!checkCol(val, j)) { 
    return false; 
} 
if (!checkBox(val, i, j)) { 
    return false; 
} 
this.model[i][j] = val; 
return true; 
} 

이제는 모델 [] []을 전혀 변경하지 않은 것처럼 보입니다. 이 클래스를 초기화 할 때 모델 [] []에 0을 넣고 유효한 Sudoku 값을 가진 파일을 가져 오는 것으로 시작합니다. 이 부분은 지금까지 작동합니다. 지금 실행하면 fsolve 함수가 아무 것도하지 않는 것처럼 보입니다.

파일 Cmd output을 가져온 후이 모양이 그대로 유지되지만 fsolve 기능을 수행 한 후에도 동일합니다.

+1

스택 추적으로 예외를 게시하십시오. –

답변

0

i<this.SIZE이지만 여전히 isEmpty(i,j)으로 전화를 걸면 j은 아마도 범위를 벗어납니다. (난 당신이 i를 충돌 할 때 j을 변경할 필요가 있다고 생각합니다.)

+0

나는 그것을 확실히해야만했다. 이제는 아무 것도주지 못합니다. –

+0

"나에게 아무것도주지 않는다"는 것은 반환하지 않는다는 것을 의미합니까? 시도 할 조합이 많이 있습니다. –

+0

아니요, 모델 [] []을 전혀 변경하지 않습니다. OP를 편집하여 tryValue 함수 (2 초)를 표시합니다. –

0
public boolean fsolve(int i, int j){ 
    if (j >= this.SIZE){ 
     i++; 
     j = 0; 
     if (i>=this.SIZE){ 
      return true; 
     } 
    } 

당신이 i와 j는 X가되고 싶어요, y는이 문제를 해결할 수있는 좌표를 2 차원 격자를 사용하는 가정. 그렇지 않은 경우 자세한 정보를 제공해주십시오.

+0

예, 그렇게해야했습니다. 이제는 아무 것도하지 않습니다. –